如果crypt()
每次都生成一个不同的字符串,那么我应该如何在数据库中为相同的加密密码组合提供的密码和盐?
我原以为我可以为crypt()方法生成随机盐,以便与用户组合使用。提供用于加密密码的输入(id est crypt(@_POST['password'],$salt)
)。这会为我的数据库生成加密密码。我还在$salt
列中将salt
存储在我的数据库中。
我以为我可以致电crypt($_POST['providedPassword'],$saltStoredInDatabaseFromRegistrationTime)
从注册表单中为我已存储在数据库中的密码返回相同的加密值,但事实证明crypt()
正在返回每次我称之为不同的价值。
我应该如何在数据库中获得与密码相同的加密值?
答案 0 :(得分:2)
crypt()
的工作方式是这样的:
// to create
$hash = crypt($password, $salt);
// to verify
if (crypt($password, $hash) == $hash) {
// yay!
}
不完全那样; crypt()
具有各种哈希算法,它可以返回无效哈希值以指示错误。最后,您应该使用不易受时间攻击影响的比较函数来比较哈希值,例如新的hash_equals()
注意:始终每次使用crypt()
散列内容时生成新的盐非常重要。
也就是说,自PHP 5.5起,您应该使用password_hash()
和password_verify()
来填充密码;对于早期版本,您可以使用password_compat库。