生成的哈希值大小和算法速度并不重要,我只关心它是最安全的选项。我也不想使用任何第三方库。
我使用的.NET框架版本是3.5,如果这有什么区别的话。
生成的哈希值大小和算法速度并不重要,我只关心它是最安全的选项。我也不想使用任何第三方库。
我使用的.NET框架版本是3.5,如果这有什么区别的话。
你表示算法的速度不重要,但实际上它是至关重要的。
很多事情取决于“安全”的定义,SHA512
几乎不可能被反转,但实际上相当容易遭受暴力破解攻击。
这是因为它非常快——你可以认为这是SHA“家族”基本设计缺陷之一,它们都被设计成非常快。
这是一个问题——SHA512
达到了它的设计目标,即非常快(它比SHA1
慢不了多少),但如果你是一个试图暴力破解密码的黑客,那么这就使得它更容易被破解。10年甚至5年前,严重的暴力破解攻击是不可能的,现在只需要几张高级显卡或一些云计算时间。
这就是键扩展算法发挥作用的地方——它们使得构建密码哈希的过程变得故意缓慢。足够缓慢,以至于检查单个哈希值的用户不会注意到,但暴力破解攻击将需要太长时间。
一个好的密钥延伸算法的例子是RFC2898或PBKDF2——它使用一个长盐并执行数千次SHA算法来创建一个难以复制的哈希值。Rfc2898DeriveBytes
他们用它来进行System.Web.Crypto.HashPassword
,但你可以轻松地review their source在其他地方使用它。Rfc2898DeriveBytes
哈希值与1000次迭代(默认值)需要大约50毫秒,而我可以在一秒钟内暴力破解大约250,000个SHA512哈希值。
目前在 .Net 中最安全的选项是使用 Rfc2898DeriveBytes
。
然而 RFC2898/PBKDF2 有一个弱点 - 虽然它很慢,但并行计算变得越来越便宜,并且构建每个哈希所需的内存不多。现在它还算是比较难以暴力破解,但是五到十年后呢?
因此,下一代算法像 bcrypt/scrypt 都被设计为对每个哈希使用大量内存,使并行执行变得昂贵。虽然有 .Net 实现,但尚未有本地实现,我会谨慎使用,直到有本地实现 - 使用这些将影响许多事情,例如并发登录(如果用于密码),因此为早期采用者引入了很多风险。
用户询问在.NET中最安全的哈希算法是什么,PBKDF2不是哈希算法,它是一种派生加密密钥的方法,底层伪随机函数可能是哈希算法,但在Rfc2898DeriveBytes中实际上是HMACSHA1在x次传递中的每个哈希值的每个字节与下一个字节异或(称为键拉伸)。
因此,目前在.NET中最安全的哈希算法是HMACSHA512。
如果您想要“哈希”密码(我之所以说“哈希”,是因为它不是直接的哈希函数输出),这里有一个API,它采用PBKDF2并使用HMACSHA512来派生字节,而不是使用HMACSHA1实现的Rfc2898DeriveBytes MS:https://sourceforge.net/projects/pwdtknet