【发布时间】:2010-09-19 13:11:53
【问题描述】:
生成的哈希大小和算法的速度并不重要。我真的只对它是最安全的选择感兴趣。我也不想使用任何第三方库。
我使用的 .NET 框架的版本如果 3.5 有什么不同的话。
【问题讨论】:
标签: .net security encryption hash
生成的哈希大小和算法的速度并不重要。我真的只对它是最安全的选择感兴趣。我也不想使用任何第三方库。
我使用的 .NET 框架的版本如果 3.5 有什么不同的话。
【问题讨论】:
标签: .net security encryption hash
我认为SHA512 是内置哈希算法的最佳选择。它是一种非常安全的算法的最大散列形式。
另外,不要忘记使用盐来帮助保护哈希免受dictionary attacks 的影响。
【讨论】:
您说算法的速度并不重要,但实际上它很重要。
很大程度上取决于“安全”的定义,SHA512(几乎)不可能逆转,但实际上是fairly easy to brute force attack it。
这是因为它快速 - 您可以将其视为 SHA“家族”的基本设计缺陷,因为它们的设计速度非常快。
这是一个问题 - SHA512 实现了它的设计目标,即非常快(它并不比 SHA1 慢多少),但如果你是一个尝试暴力破解密码的黑客,那么它更容易被破解。 10 甚至 5 年前,严重的暴力攻击是不可能的,现在是几个花哨的显卡或一些云时间。
这就是密钥扩展算法的用武之地——它们使构建密码哈希的过程故意变慢。速度很慢,以至于用户检查单个哈希不会注意到,但暴力攻击会花费太长时间。
密钥扩展算法的一个很好的例子是 RFC2898 或 PBKDF2 - 它使用长盐并执行 SHA 算法数千次来创建一个复制速度很慢的哈希。
.Net 有一个本机实现:Rfc2898DeriveBytes
他们将其用于System.Web.Crypto.HashPassword,但您可以轻松地将review their source 用于其他地方。
现在在我的机器上(一台相当垃圾的旧笔记本电脑)一个 .Net Rfc2898DeriveBytes 哈希值 1000 次迭代(默认值)大约需要 50 毫秒,而我可以在一秒钟内暴力破解大约 250,000 个 SHA512 哈希值。
所以现在在 .Net 中最安全的选择是使用Rfc2898DeriveBytes。
但是 RFC2898/PBKDF2 确实有一个弱点 - 虽然速度很慢,但并行计算越来越便宜,而且构建每个哈希不需要太多内存。现在它是相当不暴力的,但在 5 或 10 年后?
因此下一代算法是像bcrypt/scrypt 这样的算法,旨在为每个哈希使用大量内存,从而使并行执行变得昂贵。虽然有 .Net 实现,但还没有一个原生的实现,我会小心使用一个,直到有 - 使用这些会影响并发登录(如果用于密码)等负载,因此引入早期采用者的风险很大。
【讨论】:
用户询问.NET 中什么是最安全的散列算法,PBKDF2 不是散列算法,它是一种派生加密密钥的方法,是的,底层伪随机函数可能是散列算法,但在 Rfc2898DeriveBytes 中它实际上是 HMACSHA1 x 与每次传递的每个哈希值的每个字节进行异或与下一次传递(称为键拉伸)。
所以要回答目前的问题,HMACSHA512 是目前 .NET 中最安全的哈希算法。
如果您希望“散列”密码,(我说散列是因为它不是直接散列函数输出)这里有一个 API,它采用 PBKDF2 并使用 HMACSHA512 来导出字节,而不是使用 HMACSHA1 实现的 Rfc2898DeriveBytes MS:@ 987654321@
【讨论】: