问题描述
在我的数据库中,我使用弱哈希 SHA1 作为密码。我想将它们迁移到更强的哈希 (bcrypt) 中。通常是通过以下PHP脚本完成的:
$sql = "SELECT user_id,password from users";
/**
* @var $pdo database connection
*/
$statement = $pdo->prepare('UPDATE users SET password = :password WHERE user_id = :user_id");
foreach( $pdo->query($sql) as $user)
{
$password = password_hash($user['password'],PASSWORD_DEFAULT);
$statement->bindParam(':password',$password);
$statement->bindParam(':user_id',$user['user_id']);
$stmt->execute();
}
但是在大型数据集上更新需要很长时间。因此,您知道一种在 postgresql 中使用 postgresql 本地密码更新来散列所有用户密码的更快方法吗?
此外,上面的代码将在迁移脚本中运行,也可能导致部署延迟。
解决方法
为了更新密码,请运行以下sql:
UPDATE users SET password = crypt(users.password,gen_salt('bf')),double_hash=true;
确保密码字段长度至少为 72 个字符。成功登录后,使用 password_hash
重新哈希提供的密码。