为什么传递给Crypto.HashPassword的密码不应该被加盐?



所以,在 ASP.NET,

System.WebHelpers.Crypto.HashPassword("123456");

将创建一个每次都是唯一的哈希、加盐字符串。这很棒;这意味着,如果有人设法掌握了散列密码(例如,在SQL注入攻击中(,他们将无法使用查找表来查找原始密码。但是,据我所知,他们仍然能够轻松编写代码以尝试在本地进行暴力破解,而无需涉及受害者的服务器,例如:

foreach(string passwordToTry in BigListOfCommonPasswords)
if (Crypto.VerifyHashedPassword(stolenHash,passwordToTry)) return passwordToTry;

。因此,在调用 HashPassword 时添加自己的额外盐不是更好吗,其中额外的盐存储在数据库之外,例如:

System.WebHelpers.Crypto.HashPassword("123456"+getSaltFromWebConfig());

...,还是出于某种原因这毫无意义?在我看来,值得做一些使上述蛮力攻击变得更加困难的事情,但我从未在Crypto.HashPassword的使用示例中看到过这个想法,所以我缺少什么吗?

编辑:这不是隐藏哈希盐的必要性的副本。这个问题是在问一个未隐藏的盐是否有任何用处。我不否认存储在与散列密码相同的位置的盐是有用的,或者将无盐密码传递给Crypto.HashPassword是有用的。我真正得到的是,添加您自己的,额外的盐,存储在其他地方(即使每个用户都相同(,在Crypto.HashPassword提供的保护之上提供了额外的保护层。

在暴露数据库的SQL注入攻击的情况下,web.config文件中的额外盐仍然会受到保护(或者至少需要完全不同的攻击才能访问它(。

System.WebHelpers.Crypto.HashPassword("123456"+getSaltFromWebConfig());

使散列密码对攻击者的用处远低于

System.WebHelpers.Crypto.HashPassword("123456");

对于某些类型的攻击,并且在计算能力或编程时间方面没有太多额外的成本。

你所描述的盐通常被称为辣椒。关于是否使用辣椒的问题在这里已经得到了非常完整的回答:

最佳实践:腌制和胡椒密码?

总之,你不应该使用辣椒,因为:

  • 您无法更改 pepper 的值,因为哈希函数是一种方式。
  • 添加辣椒可以有效地改变哈希算法,这只能由专家完成。

但是,如果假设获取静态机密比获取密码哈希更难,则还有另一种选择可以提高安全性。与其添加胡椒粉,不如使用标准对称算法简单地加密哈希和盐的组合。这解决了上述两个问题,同时在加密密钥未泄露的情况下仍可提高安全性。

最新更新