生成的哈希的大小和算法的速度并不重要.我真的只对它是最安全的选择感兴趣.我也不想使用任何第三方库.
我正在使用的.NET框架的版本,如果3.5有任何区别.
我认为SHA512将是内置哈希算法的最佳选择.它是非常安全算法的最大哈希形式.
此外,不要忘记使用salt来帮助保护哈希免受字典攻击.
您声明算法的速度并不重要,但实际上它是必不可少的.
很大程度上取决于'安全'的定义,SHA512
(几乎)不可能逆转,但实际上它很容易暴力攻击它.
这是因为它很快 - 您可以将其视为SHA'家族'的基本设计缺陷,因为它们的设计非常快.
这是一个问题 - SHA512
实现它的设计目标是非常快(它不会慢很多SHA1
)但是如果你是一个黑客尝试暴力密码,这使得它更容易破解.10年甚至5年前,一场严重的蛮力攻击本来是不可能的,现在它是一些花哨的显卡或一些云时间.
这就是密钥拉伸算法的用武之地 - 它们使构建密码哈希的过程故意变慢.慢到足以让用户检查单个哈希不会注意到,但是暴力攻击需要花费太长时间.
密钥拉伸算法的一个很好的例子是RFC2898或PBKDF2 - 它使用长盐并执行数千次SHA算法来创建一个重现缓慢的哈希.
.Net有一个本机实现: Rfc2898DeriveBytes
他们使用它System.Web.Crypto.HashPassword
,但你可以轻松地查看他们在其他地方使用它的来源.
在我的机器上(一台相当垃圾的旧笔记本电脑)单个.Net Rfc2898DeriveBytes
散列1000次迭代(默认值)需要大约50ms,而我可以在一秒钟内暴力约250,000个SHA512哈希.
所以在.Net中,现在最安全的选择是使用Rfc2898DeriveBytes
.
然而RFC2898/PBKDF2确实有一个弱点 - 虽然它很慢并行计算变得越来越便宜,并且它不需要太多内存来构建每个哈希.现在它是非常强大的,但在5年或10年内呢?
所以下一代是像bcrypt/scrypt这样的算法,它们被设计为每个哈希使用大量内存,使得并行执行变得昂贵.虽然有.Net实现,但是还没有原生的实现(并且)我会谨慎使用它直到有用 - 使用这些会影响并发登录(如果用于密码)之类的东西,所以介绍早期采用者面临很大风险.