.NET框架中最安全的哈希算法是什么?

3

生成的哈希值大小和算法速度并不重要,我只关心它是最安全的选项。我也不想使用任何第三方库。

我使用的.NET框架版本是3.5,如果这有什么区别的话。

3个回答

13

我认为从内置的哈希算法中,SHA512可能是你最好的选择。它是一种非常安全的算法,并且具有最大的哈希长度。

此外,不要忘记使用盐来保护哈希值免受字典攻击


4
答案发布时,使用SHA512可能足够了——但现在在.NET中讨论安全散列需要考虑PBKDF2(.NET支持该算法)。 - Keith
1
@Keith 自从2008年以来,没有任何变化。SHA512仍然是.net中最强大的加密哈希函数。但它只是不是,也从未是一个密码哈希函数。对于密码哈希,需要像PBKDF2或bcrypt这样的专门构造已有数十年的历史了。 - CodesInChaos
@CodesInChaos 好的 - 我认为最近改变的是高调的暴力破解数量,其中直接使用SHA512作为密码哈希并用几百美元的云计算时间进行拆解 - 这些构造并不新鲜,但允许人们使用它们的满足感现在更容易被发现。 - Keith

11

你表示算法的速度不重要,但实际上它是至关重要的。

很多事情取决于“安全”的定义,SHA512几乎不可能被反转,但实际上相当容易遭受暴力破解攻击

这是因为它非常——你可以认为这是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 有一个弱点 - 虽然它很慢,但并行计算变得越来越便宜,并且构建每个哈希所需的内存不多。现在它还算是比较难以暴力破解,但是五到十年后呢?

因此,下一代算法像 bcrypt/scrypt 都被设计为对每个哈希使用大量内存,使并行执行变得昂贵。虽然有 .Net 实现,但尚未有本地实现,我会谨慎使用,直到有本地实现 - 使用这些将影响许多事情,例如并发登录(如果用于密码),因此为早期采用者引入了很多风险。


0

用户询问在.NET中最安全的哈希算法是什么,PBKDF2不是哈希算法,它是一种派生加密密钥的方法,底层伪随机函数可能是哈希算法,但在Rfc2898DeriveBytes中实际上是HMACSHA1在x次传递中的每个哈希值的每个字节与下一个字节异或(称为键拉伸)。

因此,目前在.NET中最安全的哈希算法是HMACSHA512。

如果您想要“哈希”密码(我之所以说“哈希”,是因为它不是直接的哈希函数输出),这里有一个API,它采用PBKDF2并使用HMACSHA512来派生字节,而不是使用HMACSHA1实现的Rfc2898DeriveBytes MS:https://sourceforge.net/projects/pwdtknet


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接