如何使用crypt()和我的salt生成相同的加密数据库密码字符串值?

时间:2014-12-19 01:56:17

标签: php mysql encryption crypt

如果crypt()每次都生成一个不同的字符串,那么我应该如何在数据库中为相同的加密密码组合提供的密码和盐?

我原以为我可以为crypt()方法生成随机盐,以便与用户组合使用。提供用于加密密码的输入(id est crypt(@_POST['password'],$salt))。这会为我的数据库生成加密密码。我还在$salt列中将salt存储在我的数据库中。

我以为我可以致电crypt($_POST['providedPassword'],$saltStoredInDatabaseFromRegistrationTime)从注册表单中为我已存储在数据库中的密码返回相同的加密值,但事实证明crypt()正在返回每次我称之为不同的价值。

我应该如何在数据库中获得与密码相同的加密值?

1 个答案:

答案 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库。