如果有人故意尝试修改两个文件以具有相同的哈希值,那么有什么方法可以阻止它们? md5和sha1可以阻止多数情况吗?
我正在考虑写自己的,我想如果用户不知道我的哈希,我可能无法愚弄我的工作,即使我做得不好。
防止这种情况的最佳方法是什么?
答案 0 :(得分:18)
您可以尝试创建自己的哈希 - 它可能不如MD5好,并且“通过默默无闻的安全性”同样不可取。
如果您需要安全性,请使用多个哈希算法进行哈希。能够使用多种算法同时创建具有散列冲突的文件是不太可能的。 [并且,根据评论,让我说清楚:我的意思是发布文件的SHA-256和Whirlpool值 - 不是组合哈希算法来创建单个值,而是使用单独的算法来创建单独的值。通常,损坏的文件将无法匹配任何算法;如果有人设法使用一种算法创建碰撞值,那么在其他算法中产生第二次碰撞的可能性可以忽略不计。]
Public TimeStamp使用一系列算法。例如,请参阅sqlcmd-86.00.tgz以获取说明。
答案 1 :(得分:4)
如果用户不知道您的哈希算法,他也无法验证您实际签名的文档上的签名。
最佳选择是使用生成最长散列的公钥单向散列算法。 SHA-256创建一个256位散列,因此伪造者在创建匹配给定文档的文档之前必须尝试2个 255 不同的文档(平均),这是非常安全的。如果那还不够安全,那就是SHA-512。
此外,我认为值得一提的是,保护自己免受伪造的数字签名文件的一种良好的低技术方法是简单地保留您签署的任何内容的副本。这样,如果归结为争议,您可以证明您签署的原始文档已被更改。
答案 2 :(得分:2)
为什么要尝试创建自己的哈希算法? SHA1HMAC有什么问题?
是的,有重复的哈希值 任何比明文短的散列都必然是较少的信息。这意味着会有一些重复。哈希的关键是重复很难逆向工程。
考虑CRC32 - 通常用作哈希。这是一个32位的数量。因为宇宙中有超过2 ^ 32条消息,所以会有CRC32重复。 同样的想法适用于其他哈希。
答案 3 :(得分:2)
这里有一个难度级别(针对攻击者)。找到具有相同哈希值的两个文件比生成一个匹配给定哈希值的文件更容易,如果您不必遵守表单/内容/长度限制,则更容易执行后续操作。
因此,如果可以使用定义明确的文档结构和长度,无论您使用什么底层哈希,都可以让攻击者的生活更加艰难。
答案 4 :(得分:1)
这称为“哈希冲突”,避免它的最佳方法是使用强哈希函数。 MD5相对容易人为地构建碰撞文件,如here所示。同样地,已知有relatively efficient method用于计算碰撞的SH1文件,尽管在这种情况下“相对有效”仍需要数小时的计算时间。
通常,MD5和SHA1的破解成本仍然很高,但并非不可能。如果您真的担心它,请使用更强大的哈希函数,例如SHA256。
除非你是一位非常专业的密码学家,否则编写自己的实际上并不是一个好主意。大多数简单的想法都经过了尝试,并且有众所周知的针对它们的攻击。</ p>
如果您真的想了解更多信息,请查看Schneier的 Applied Cryptography 。
答案 5 :(得分:0)
我不认为拿出自己的哈希算法是一个不错的选择。
另一个不错的选择是使用 Salted MD5 。例如,在传递给MD5函数之前,MD5哈希函数的输入附加了字符串“acidzom!@#”。
Slashdot也有很好的阅读。