Random 用户可信任随机数生成

Random 用户可信任随机数生成,random,hash,Random,Hash,我有一个基于时间戳(DDhhmmss)的8个字符的字符串,我计划通过哈希例程来获得一个伪随机的比特序列 SHA1与其他散列算法(如MD5)相比,如何生成大致均匀分布在8个数字的不同组合上的散列 (我意识到这是一个奇怪的问题,但我在寻找这样的算法:当用户给出一个种子值时,可以生成一系列比特,稍后用户可以确认这些比特是真正的伪随机的,而不是不可预测的随机的——因此使用哈希算法——特别是那些也托管在互联网某处的算法).作为哈希函数仍然有一些优点,尽管它不再适用于加密应用程序。它简单、快速,几乎在多个实

我有一个基于时间戳(DDhhmmss)的8个字符的字符串,我计划通过哈希例程来获得一个伪随机的比特序列

SHA1与其他散列算法(如MD5)相比,如何生成大致均匀分布在8个数字的不同组合上的散列

(我意识到这是一个奇怪的问题,但我在寻找这样的算法:当用户给出一个种子值时,可以生成一系列比特,稍后用户可以确认这些比特是真正的伪随机的,而不是不可预测的随机的——因此使用哈希算法——特别是那些也托管在互联网某处的算法).

作为哈希函数仍然有一些优点,尽管它不再适用于加密应用程序。它简单、快速,几乎在多个实现(内部/外部库、操作系统、外部程序)中的任何地方都可用,因此您不仅可以轻松地使用它,而且还可以根据某些替代实现轻松验证正确的操作。把它想象成CRC32的老大哥

没有这样的优点,新一代的标准哈希(SHA-256是;)在各个方面都让它黯然失色。更不用说SHA-0偶尔会被错误地标记为SHA-1,这会给所有相关人员带来无尽的乐趣

也就是说,如果没有强大的计算能力和先进的密码分析技术(如差分密码分析),几乎不可能检测出这些散列中的任何一种。出于实际原因和灵活性,我坚持使用MD5

注意:您可以通过在时间戳中添加伪随机salt,将其存储在数据库或日志中,并发布其单向函数(例如其哈希)来生成机密(不可用)序列。然后,任何序列都可以通过生成salt并显示其散列与发布的散列相匹配来进行验证;salt和时间戳一起生成原始序列。如果你正在运行游戏,那么种子/盐可以在游戏结束后立即发布

因为“信任”这个词起作用了,如果涉及到大量的玩家社区,我会考虑Sha256而不是MD5,和/或在计算发布的盐的散列时迭代地运行MD5。目的是使对已发布的哈希进行暴力攻击以获取秘密种子/盐变得不切实际

此外,只有SHA-256具有足够的内部状态,可以为52卡组生成所有可能的手牌。裸MD5和SHA-1太小了,但有一些简单的方法可以解决这个问题(只需使用更多状态)。你的时间戳是这里最大的问题,它的可能状态远少于公平的扑克交易所需的~2^226,你所加的盐必须弥补不足。例如,从/dev/uradom中提取256位。当然,这使得这个协议中的时间戳有点多余

另一种选择是使用一个更大的“id”,比如游戏挑战的实际文本或任何方便的东西。不过,为了防止作弊,仍然需要加盐

附言:如果你能从/dev/uradom或类似的东西中提取熵,用它来为你的生成器种子,并在base-64或base-96中发布一个强大的单向函数作为“游戏id”,那么这个协议将是最简单的。也就是说,去掉时间戳。密钥派生函数在这里会向后运行,但安全性分支完全相同