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