Hash 减少散列的大小

Hash 减少散列的大小,hash,cryptography,hash-collision,Hash,Cryptography,Hash Collision,如果我有一些数据,我会像这样用SHA256散列:-hash=SHA256(数据) 然后只复制散列的前8个字节,而不是整个32个字节,找到不同数据的散列冲突有多容易?是2^64还是2^32 如果我需要将某些数据的散列减少到较小的大小(n位),有没有办法确保搜索空间为2^n?我认为您实际上对三件事感兴趣 首先需要了解散列的熵分布。如果哈希函数的输出长度为n位,则最大熵为n位。注意,我说的是最大值;你永远不能保证有n个熵位。类似地,如果将散列输出截断为n/4位,则不能保证结果中有2n/4位的熵。SHA

如果我有一些数据,我会像这样用SHA256散列:-hash=SHA256(数据)

然后只复制散列的前8个字节,而不是整个32个字节,找到不同数据的散列冲突有多容易?是2^64还是2^32


如果我需要将某些数据的散列减少到较小的大小(n位),有没有办法确保搜索空间为2^n?

我认为您实际上对三件事感兴趣

首先需要了解散列的熵分布。如果哈希函数的输出长度为n位,则最大熵为n位。注意,我说的是最大值;你永远不能保证有n个熵位。类似地,如果将散列输出截断为n/4位,则不能保证结果中有2n/4位的熵。SHA-256相当合理,这在一定程度上意味着您不可能在高位比低位拥有更多的熵(反之亦然)

然而,关于这一点的信息是稀疏的,因为散列函数打算与其整个散列输出一起使用。如果只需要8字节的哈希输出,那么您可能甚至不需要加密哈希函数并可以考虑。(关键是,如果需要加密哈希函数,则需要尽可能多的位,因为缩短输出会削弱函数的安全性。)

第二个是搜索空间:它完全不依赖于哈希函数。搜索在哈希函数上创建给定输出的输入通常称为。必须搜索的输入数量不取决于哈希函数本身;怎么可能呢?每个哈希函数输出都是相同的:每个SHA-256输出是256位。如果您只需要一个冲突,您可以找到一个特定的输入,它生成每个可能的256位输出。不幸的是,这将占用256*2256的最小存储空间≈ 3*1079,仅用于散列值本身(即不计算生成散列值所需的输入),这大大掩盖了散列值本身

因此,搜索空间取决于哈希函数输入的复杂性和长度。如果数据是8个字符长的ASCII字符串,则可以很好地保证不会发生冲突,但这些哈希值的搜索空间只有27*8≈ 7.2*1016,您的计算机可能会在几分钟内搜索到它。毕竟,如果可以找到原始输入本身,就不需要找到冲突。这就是为什么它们在密码学中很重要

第三,你有兴趣知道碰撞阻力。作为GregS'的例子,一个空间的抗碰撞能力比输入搜索空间要有限得多,这是因为

每个输入多于输出的哈希函数都必然会有冲突。考虑一个散列函数,例如从任意大输入产生256位输出的SHA256。因为它必须为更大的输入集的每个成员生成2256个输出中的一个,所以鸽子洞原理保证一些输入将散列到相同的输出。抗碰撞并不意味着不存在碰撞;很简单,它们很难找到

“生日悖论”为抗冲突性设置了上限:如果哈希函数产生N位输出,则对随机输入“仅”计算2N/2(或sqrt(2N))哈希操作的攻击者可能会找到两个匹配的输出。如果有比这种暴力攻击更简单的方法,通常会将其视为哈希函数中的一个缺陷


请考虑在检查和存储输出的前8个字节(四分之一)时会发生什么。您的碰撞阻力已从2256/2=2128降至264/2=232。232比2128小多少?事实证明,它要小得多,最多只占大小的0.000000000000000000000000000的1%。

我投票将这个问题作为离题题来结束,因为它似乎是关于密码分析的,不包括编程问题。我还注意到,您已经将它交叉发布到Crypto,这可能是一个更适合它居住的地方。