在 2009 年编写一个普通的新应用程序时,就安全性和性能而言,最合理的摘要功能是什么?(随着条件的变化,我如何在未来确定这一点?)
之前提出类似 问题 时,答案包括 SHA1、SHA2、SHA-256、SHA-512、MD5、bCrypt 和 Blowfish。
我意识到,在很大程度上,如果明智地使用这些中的任何一个都可以工作,但我宁愿不掷骰子并随机选择一个。谢谢。
我会遵循NIST/FIPS 指南:
2006 年 3 月 15 日:联邦机构可以将 SHA-2 系列哈希函数(即 SHA-224、SHA-256、SHA-384 和 SHA-512)用于使用安全哈希算法的所有应用程序。联邦机构应尽快停止将 SHA-1 用于数字签名、数字时间戳和其他需要抗碰撞的应用程序,并且必须在 2010 年之后将 SHA-2 系列哈希函数用于这些应用程序。2010 年之后,联邦机构可以仅将 SHA-1 用于以下应用: 基于散列的消息验证码 (HMAC);密钥派生函数(KDF);和随机数生成器 (RNG)。无论使用哪种方式,NIST 都鼓励应用程序和协议设计人员将 SHA-2 系列哈希函数用于所有新的应用程序和协议。
你说“消化功能”;大概这意味着您想使用它来计算“长”消息的摘要(而不仅仅是像密码一样散列“短”“消息”)。这意味着 bCrypt 和类似的选择已经出局;它们的设计速度很慢,无法抑制对密码数据库的暴力攻击。MD5 彻底坏了,SHA-0 和 SHA-1 太弱了,不是很好的选择。Blowfish 是一种流密码(尽管您可以在产生摘要的模式下运行它),因此它也不是一个好的选择。
这留下了几个哈希函数系列,包括 SHA-2、HAVAL、RIPEMD、WHIRLPOOL 等。其中,SHA-2 系列是最彻底的密码分析,因此我建议将其用于一般用途。对于典型应用,我建议使用 SHA2-256 或 SHA2-512,因为这两种尺寸是最常见的,并且将来可能会被 SHA-3 支持。
这真的取决于你需要什么。
如果您需要实际的安全性,而轻松发现冲突的能力会危及您的系统,我会使用 SHA-256 或 SHA-512 之类的东西,因为它们得到了各个机构的大力推荐。
如果你需要一些快速的东西,并且可以用来唯一地识别一些东西,但没有实际的安全要求(即,如果攻击者发现碰撞,他们将无法做任何令人讨厌的事情),那么我会使用类似 MD5 的东西。
MD4、MD5 和 SHA-1 已被证明比预期更容易破坏,即通过生日攻击方法发现碰撞。RIPEMD-160 备受推崇,但只有 160 位的生日攻击只需要 2^80 次操作,因此它不会永远持续下去。Whirlpool 具有出色的特性,并且看起来是最强大的,尽管它没有与 SHA-256 或 SHA-512 相同的支持 - 从某种意义上说,如果 SHA-256 或 SHA-512 有问题,你' d更有可能通过适当的渠道了解它。