我一直在考虑将此视为尝试理解某些哈希概念的思想实验。考虑对128位散列函数的要求(即,其输出的长度恰好为128位)。
一个。您可能会看到像MD5这样的东西。因此,您输入要散列的数据,然后弹出128位数字。
B中。或者,您可以找到一个神奇的伪随机数生成器(PRNG)。某种弗兰肯斯坦版的Twister。它会从您要散列的所有输入数据中自行播种,并具有内部状态大小>> 128位。然后生成128个伪随机位作为输出。
在我看来,A和B都有效地产生仅由输入数据确定的输出。这两种方法是否相同?
补充:
某些反馈表明可能存在与我的方案无效的安全性。如果伪随机数生成器类似于Java的SecureRandom(使用SHA-1),从输入数据接种,那么A< =>乙
答案 0 :(得分:1)
如果您使用输入数据为PRNG播种,然后从中提取128位随机数据,那么您实际上将散列留给PRNG种子函数,并且它生成的散列的大小将是PRNG状态缓冲区。
但是,如果PRNG的状态大于您提取的128位哈希值,则存在用于种子的某些输入数据不会对其产生任何影响的风险。您提取的PRNG状态的位。这使得它非常糟糕,所以你不想这样做。
PRNG种子功能通常是非常弱的哈希,因为哈希不是他们的业务。他们几乎肯定不安全(你没有问过),并且他们通常在雪崩时非常弱。强哈希通常会尝试确保每个输入位都有可能影响输出的每一位。如果输入数据太短,不安全的哈希通常不会担心他们会在此失败,但是PRNG种子通常会毫不费力。
答案 1 :(得分:0)
加密哈希函数旨在使 hard 创建生成特定哈希的输入;和/或更多,很难创建两个生成相同哈希的输入。
如果将某些内容设计为随机数生成算法,那么这不是设计的要求之一。因此,如果某些东西“只是”一个随机数生成器,则无法保证它满足加密哈希码的这些重要约束。所以从这个意义上讲,它们并不等同。
当然可能有随机数生成算法也被设计为加密哈希算法,在这种情况下(如果实现在满足要求方面做得很好),它们可能是等价的。