哈希和盐值碰撞

5
我记得有个人告诉我,如果我允许他更改4个字节,他就可以使一个文件具有任何校验和(CRC-32)。
我听说过给哈希值加盐。我想知道,如果有人的文件与我的文件匹配,那么给MD5或SHA-1哈希值加盐会改变结果,使两个文件不再冲突吗?还是只改变了最终的哈希值?
4个回答

6
您正在混淆两种哈希值的不同用途:
1. 用于防范随机(非恶意)错误的校验和。 2. 用于存储密码、签名信息、证书等的计算加密消息摘要。
CRC 对于第一种应用是一个很好的选择,但完全不适用于第二种应用,因为很容易计算出碰撞(在数学术语中:CRC 是线性的)。这就是你的朋友实质上告诉你的。
MD5 和 SHA1 是为第二种应用而设计的加密哈希。然而,MD5 已经被破解,SHA1 如今也被认为是不安全的。尽管如此,即使 MD5 被破解,找到 MD5 碰撞也需要很长时间(几天到几周)。
至于 salt,它通过混入一些随机的非秘密值(称为“盐”)来使计算加密哈希本地化,从而防止计算全局表,这样就容易从哈希值中计算出可能的值(例如密码)。计算表格的成本非常高昂,但如果没有盐,成本将分摊在许多破解的密码上。

什么是“全局表”,它们如何使计算变得容易? - user34537

4

如果您使用的哈希函数不是CRC-32,那么针对CRC-32的攻击就无关紧要了——MD5SHA-1目前还没有受到这种攻击的漏洞。

当前针对MD5的攻击是攻击者创建两个具有相同哈希值的文档。

盐用于密码验证,可以防止攻击者对密码数据库进行离线攻击。每个用户的密码在散列之前都附加了一个盐,因此预先计算的明文<->哈希文本的彩虹表将变得无用。


1

如果摘要函数已被破解,添加盐到哈希函数并没有什么作用,因为盐必须公开使用,攻击者也可以调整他们的文件来考虑这一点。

解决这个问题的方法是使用安全的哈希函数。MD5已经显示出易于哈希碰撞,但我相信SHA-1目前还没有。


0

在密码哈希中通常使用盐来避免字典攻击。有很多基于Web的反向哈希字典,您可以输入哈希(例如:1a79a4d60de6718e8e5b326e338ae533),然后得到文本:“example”。使用盐,这变得几乎不可能。如果在密码前面添加随机盐,则字典攻击变得更加困难。

至于碰撞,我认为您无需担心整个文件具有相同的md5或sha1哈希。这并不重要。哈希的重要用途是证明您收到的文件与某个对该文件有权威的人批准的文件相同。如果您向文件添加盐,则需要发送盐以便用户可以验证哈希。

实际上,这使攻击者更容易欺骗您的文件,因为他可以提供虚假的盐和虚假的文件。用户通常可以判断文件是否被伪造,因为它不再起到应有的作用。但是用户如何知道正确的盐和攻击者的盐之间的区别呢?


2
你混淆了字典攻击和彩虹表攻击。盐值并不能保护你免受字典攻击,因为它们是在密码级别上执行的(即尝试从列表中使用密码),而不是在哈希级别上。 - Andreas Magnusson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接