我正在以安全的方式将我的用户密码存储在我的数据库中。我读了一下,我被建议使用openssl_random_pseudo_bytes来生成我的盐。我这样做:
while(true)
{
var value = activesheet.Range["A" + n].Text; // one COM call instead of multiple
if (strings.Contains(value)) break;
}
它有效,但我在徘徊两件事:
- 我的盐和数据库的长度应该是多少,如果我的盐有30个字符的例子,我只需要一个长度为30的varchar字段?
- openssl_random_pseudo_bytes会不会生成一个新的盐?如果没有,这是否意味着我需要将我的盐与我数据库中所有其他现有盐进行比较,以确保没有任何重复?
答案 0 :(得分:3)
salt的原始格式长度为16个字节,并且不是十六进制编码的。 但是,你不应该自己生成它,也不应该在数据库中有一个单独的salt字段!
password_hash()将自动生成一个盐(并且它会比你更好),然后将它存储在哈希本身中 - 这就是算法的工作方式。
除了password_hash()
和password_verify()
之外,您不应该使用任何其他内容来使整个过程发挥作用。
此外,openssl_random_pseudo_bytes()
有更好的替代方法可用于生成随机数据,例如PHP7下的random_bytes(),或者是旧版PHP版本的后端程序 - random_compat包。