2014-11-14 175 views
0

我有一個基於時間戳(DDhhmmss)的8個字符的字符串,我打算通過散列例程來獲取僞隨機系列位。用戶可信的隨機數生成

SHA1與其他哈希算法(如MD5)相比,在8個數的不同組合中大致均勻分佈的哈希生成如何比較? (我意識到這是一個奇怪的問題,但我正在尋找的算法,當用戶給出種子值可以產生一系列的位,用戶以後可以確認它是真正的僞隨機的,並且不可預測的隨機 - 因此使用哈希算法 - 特別是那些在互聯網上也託管的算法)。

回答

1

MD5作爲散列函數仍具有一些優點,即使它不再適合加密應用程序。它在多種實現(內部/外部庫,操作系統,外部程序)中幾乎在任何地方都簡單,快速和可用,因此您不僅可以毫不費力地使用它,而且還可以輕鬆驗證針對某些替代實現的正確操作。把它想象成CRC32的大哥。

SHA-1沒有這樣的優點,並且在新一代的標準哈希(SHA-256作爲SHA-2; SHA-3的化身)的各方面都被黯然失色。更不要說SHA-0偶爾會被貼上SHA-1的標籤,這對所有相關人員來說都是無趣的。即使沒有大量的計算能力和先進的密碼分析技術(如差分密碼分析),也應該幾乎不可能檢測到任何散列中的偏差。出於實際原因和靈活性,我會堅持使用MD5。

注意:您可以通過向您的時間戳添加僞隨機鹽,將其存儲在數據庫或日誌以及發佈它的單向函數(例如其哈希)來生成一個祕密(不可猜測)序列。然後可以通過生成salt並顯示其哈希與發佈的哈希匹配來驗證任何序列;鹽和時間戳,然後生成原始序列。如果您正在運行遊戲,那麼只要遊戲結束,就可以發佈種子/鹽。因爲「信任」一詞在這裏發揮作用,所以如果涉及大型玩家社區,我會考慮使用SHA-256而不是MD5,並且/或者在計算鹽的散列時以迭代方式運行MD5發佈。目的是爲了獲得祕密的種子/鹽而對發佈的哈希進行暴力攻擊是不切實際的。

此外,只有SHA-256有足夠的內部狀態才能爲52張牌組生成所有可能的牌。裸MD5和SHA-1太小,但有一些簡單的方法(只是使用更多的狀態)。你的時間戳是這裏最大的問題,它的可能狀態遠遠少於處理公平撲克所需的〜2^226的狀態,並且你添加的鹽必須彌補鬆弛。例如。從/ dev/urandom中繪製256位。當然,這使得協議中的時間戳有點多餘......

另一種方法是使用更大的'id',就像遊戲挑戰的實際文本或任何碰巧方便的東西。儘管如此,醃製仍然需要防止作弊。 PS:如果你可以從/ dev/urandom或類似的東西中繪製熵,使用它來爲你的生成器播種,並在base-64或base-96上發佈一個強大的單向函數,協議將是最簡單的作爲'遊戲ID'。即溝時間戳。密鑰派生函數將在這裏向後運行,但安全分支完全相同。

+0

太棒了! – 2014-11-16 21:21:00