如何安全地存储密码盐

时间:2015-12-26 15:18:40

标签: hash passwords password-protection salt

我使用pbkdf2加密和哈希密码。我知道盐必须是未加密和可访问的,所以我可以在验证中再次使用它。每个密码的盐必须是可访问的,因此我可以对要验证的密码进行加密和散列,并将其与存储的密码进行比较。

我当时想要像这样储存盐

假设salt总是一个具有固定长度的字符串,例如10个字符

finalPassword = salt + password;
//save finalPassword in the db

然后验证

salt = getFirst10CharsOf (finalPassword);

hash to-be-validated password with that salt

compare hashed password with the saved one

我的问题是,如果一个黑客足够智能来获取我的哈希密码,那么是什么阻止她在我的代码中看到getFirst10CharsOf部分并得到一些盐,这样她就可以很容易地解密几个哈希值?

我找到了很多理论,但我不知道如何在练习中安全地储存盐。因此,它们始终只能访问验证代码,但不能访问所有人。

由于

2 个答案:

答案 0 :(得分:2)

盐不需要保密,它可以用于以下几个方面:1。使用彩虹表更加困难; 2.确保两个密码不会散列到相同的值,这样如果一个密码泄露了其他相同的密码不是(不同的哈希)。

答案 1 :(得分:2)

  

是什么阻止她在我的代码中看到getFirst10CharsOf部分并得到一些盐,

没有

  

所以她可以很容易地解密几个哈希?

使用单向散列的关键是你无法解密它们(甚至没有使用盐)。

使用盐(每次使用不同的盐)的关键是你不能用彩虹表强行使用它。

  

我不知道如何在实践中安全储存盐。

只需使用哈希密码存储它们即可。没有必要让它们无法访问。

  

因此,它们始终只能访问验证码,但不能访问所有人。

如果可以将数据存储在您的代码可以访问的某个地方,但有人会非法访问系统,代码运行就不行,那么就不需要首先散列密码了。