2014-11-14 56 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