这个维基百科页面列出了大量的哈希方法。
可以看到,MD5和Sha1都已经被“破解”(在密码学中,“破解”意味着攻击比暴力攻击更简单。换句话说,如果你需要一百万年而不是十亿年来寻找碰撞,那么算法被认为是破解了,即使它可能仍然安全可用)。
你使用什么哈希算法呢?
SHA1已经被破解,但计算一个碰撞仍需要数十亿年的时间。
其他哈希函数仍未被破解,但我们必须记住,研究人员集中精力研究主流算法(即MD5和SHA1),因此未被破解的哈希函数也可能不安全。
这个维基百科页面列出了大量的哈希方法。
可以看到,MD5和Sha1都已经被“破解”(在密码学中,“破解”意味着攻击比暴力攻击更简单。换句话说,如果你需要一百万年而不是十亿年来寻找碰撞,那么算法被认为是破解了,即使它可能仍然安全可用)。
你使用什么哈希算法呢?
SHA1已经被破解,但计算一个碰撞仍需要数十亿年的时间。
其他哈希函数仍未被破解,但我们必须记住,研究人员集中精力研究主流算法(即MD5和SHA1),因此未被破解的哈希函数也可能不安全。
现在大多数人仍然使用SHA1或甚至MD5,无论它们是否已经被破解。因为散列技术的现状是我们有一些已知存在理论漏洞但没有被真正破解的函数,以及一些我们很少了解的未经验证的函数。
如果您正在使用哈希函数进行密码存储,那么理论上的漏洞可能对您并不重要。首先,因为这些漏洞的本质并不能真正帮助破解密码。其次,如果您真的非常关注安全,您可能不会使用密码。
在数字签名、SSL、IPSEC等使用哈希函数的情况下,理论上的漏洞将更加重要,特别是如果您需要长期保证哈希函数的安全性。然而,在这种情况下,你唯一能做的就是等待看哪些哈希函数成为可靠的新标准,或者如果可能的话使用一个以上的哈希函数。
即便如此,在所有威胁中,这在大局上仍然是最不重要的。系统中的安全问题更可能出现在您自己的代码或针对人员的威胁中,而不是攻击哈希函数!
然而,如果设计一个新系统,建议设计它,以便您可以随时替换任何加密算法。最好通过配置/插件实现,而不是重新编译。
并遵循其他适当的安全指南:)
这取决于我使用哈希的目的是什么...
安全性?文件更改检测?查找重复文件?
从问题的提问方式来看,我假设您使用哈希的原因是前者。在这种情况下,我建议不要使用“不安全”的方法。
如果不是安全用途(例如查找重复文件),MD5 可以很好地工作并且速度更快。
还有其他算法,比如SHA-256或RIPEMD-160,甚至可以选择SHA-3候选列表之一(请参阅此处)。但请始终记住,这些算法尚未像MD4 / 5和SHA-1那样经过彻底的测试和分析。当然,这也会带来性能上的代价。
回答您的问题之一是使用其中两个,希望它们足够不同,以便破解一个不会破解另一个。我认为,同时破解两个校验和的可能性非常小。
这也在https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords和https://security.stackexchange.com/questions/56397/which-hashing-algorithm-is-ideal-for-use-on-the-web中讨论过。
简而言之:
如果安全是您的关注重点,最好避免使用“破损”的哈希函数。您所说的可能对某些仅被研究人员破解的哈希函数来说是正确的,但通过研究工作获得新的认识后,实际攻击很快就会出现。
例如,现在可以非常快速地发现MD5的碰撞(我认为维基百科提到了一种可以在几分钟内完成的方法,但如果我错了请纠正我)。
如果发生这种情况,您不想重新计算已经计算过的大量哈希/签名。