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

时间:2016-02-10 12:44:17

标签: asp.net security

所以,在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的使用示例中看到过这个想法,所以我有什么遗漏吗?

编辑:这不是The necessity of hiding the salt for a hash的重复。那个问题是询问一种未被隐藏的盐是否对它有任何用处。我不是在争论存储在与散列密码相同位置的盐是有用的,或者将未加密的密码传递给Crypto.HashPassword是有用的。 我真正想到的是,在其他地方添加你自己的附加盐(即使它对每个用户来说都是一样的),在Crypto.HashPassword提供的保护之上提供了额外的保护层。

在SQL注入攻击暴露数据库的情况下,例如web.config文件中的附加盐仍将受到保护(或者至少需要完全不同的攻击来访问它)。

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

使哈希密码对攻击者而言不如

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

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

1 个答案:

答案 0 :(得分:3)

你所描述的盐通常被称为胡椒。关于是否使用胡椒的问题在这里得到了非常全面的回答:

Best Practices: Salting & peppering passwords?

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

  • 你不能改变胡椒的价值,因为哈希函数是单向的。
  • 添加胡椒有效地改变了散列算法,这只能由专家来完成。
但是,如果假设获取静态秘密比获取密码哈希更难实现,则可以提高安全性。而不是添加胡椒,只需使用标准对称算法加密哈希和盐的组合。这解决了上述两个问题,同时如果加密密钥没有受到损害,仍然可以提高安全性。