我记得一个人告诉我,如果我让他改变4个字节,他可以使一个文件拥有他想要的任何校验和(CRC-32)。
我听说过盐化哈希的提法。我在想,如果有人的文件与我的文件匹配,那么盐化MD5或SHA-1哈希会改变结果,这样两个文件就不再碰撞了吗?还是只改变了最终的哈希值?
我记得一个人告诉我,如果我让他改变4个字节,他可以使一个文件拥有他想要的任何校验和(CRC-32)。
我听说过盐化哈希的提法。我在想,如果有人的文件与我的文件匹配,那么盐化MD5或SHA-1哈希会改变结果,这样两个文件就不再碰撞了吗?还是只改变了最终的哈希值?
你混淆了哈希值的两种不同用法:
用于防止随机(非恶意)错误的校验和。
为存储密码、签署信息、证书等计算加密消息摘要
CRCs是第一种应用的好选择,但是完全不适合第二种应用,因为很容易计算出碰撞(在数学术语中:CRC是线性的)。这就是你的朋友实质上告诉你的。
MD5和SHA1是用于第二种应用的加密哈希。然而,MD5已被破解,SHA1现在被认为是弱的。尽管如此,即使MD5可以被破解,但寻找MD5碰撞需要很长时间(需要数天到数周)。
至于盐,它通过混合一些随机非秘密值使密码哈希计算变为本地计算,这个值被称为盐。这可以防止计算全局表,这些表会使从哈希值计算出可能的值(如密码)变得容易。表的计算非常昂贵,但没有盐,成本会分摊在许多破解密码上。
如果散列函数已经被破解,添加盐不会真正起到任何作用,因为盐必须被公开使用,攻击者也可以调整他们的文件以考虑这一点。 (Chinese simplified)
这个问题的解决方案是使用安全哈希函数。MD5已经被证明对哈希冲突有弱点,但是我相信SHA-1目前还没有。
Salting is usually used in password hashes to avoid dictionary attacks. There are plenty of web based reverse hash dictionaries where you enter the hash (say: 1a79a4d60de6718e8e5b326e338ae533) and get back the text: "example". With salt, this becomes next to impossible. If you prepend a password with random salt, the dictionary attack become more difficult.
对于碰撞,我认为你不需要担心整个文件具有相同的MD5或SHA1哈希值。这不重要。哈希的重要用途是证明你收到的文件与该文件的授权人批准的文件相同。如果你向文件中添加盐,你需要发送盐以便用户验证哈希。
这实际上使攻击者更容易伪造您的文件,因为他可以与虚假文件一起提供虚假的盐。用户通常可以通过文件不再起到其应该起到的作用来判断文件是否被伪造。但是用户如何知道正确的盐和攻击者的盐之间的区别呢?