生成的哈希的大小和算法的速度并不重要。我真的只对它是最安全的选择感兴趣。我也不想使用任何第三方库。
我正在使用的.NET框架的版本,如果有任何不同,则使用3.5。
答案 0 :(得分:13)
我认为SHA512是内置哈希算法的最佳选择。它是非常安全算法的最大哈希形式。
另外,不要忘记使用salt来帮助保护哈希值dictionary attacks。
答案 1 :(得分:11)
您声明算法的速度并不重要,但实际上它是必不可少的。
很大程度上取决于'安全'的定义,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次迭代(默认值)需要大约50ms,而我可以在一秒钟内暴力破解大约250,000个SHA512哈希。
所以.Net现在最安全的选择就是使用Rfc2898DeriveBytes
。
然而RFC2898 / PBKDF2确实存在弱点 - 虽然它很慢并行计算变得越来越便宜,并且构建每个哈希都不需要太多内存。现在它是非常强大的,但在5年或10年后呢?
所以下一代是像bcrypt / scrypt这样的算法,它们被设计为每个哈希使用大量内存,使得并行执行变得昂贵。虽然有.Net实现,但是还没有原生的实现(并且)我会谨慎使用它直到有用 - 使用这些会影响并发登录(如果用于密码)之类的东西,所以介绍早期采用者面临很大的风险。
答案 2 :(得分:0)
用户询问.NET中最安全的散列算法是什么,PBKDF2不是散列算法,它是一种导出加密密钥的方法,是的,底层伪随机函数可能是散列算法但是在Rfc2898DeriveBytes中它实际上是HMACSHA1结束x传递每个传递的每个哈希值的每个字节与下一个传递异或(称为键拉伸)。
所以为了回答这个问题,目前HMACSHA512是.NET中最安全的哈希算法。
如果您希望“哈希”密码,(我说哈希因为它不是直接哈希函数输出)这里是一个采用PBKDF2并使用HMACSHA512来派生字节而不是使用HMACSHA1实现的Rfc2898DeriveBytes MS的API:{ {3}}