如何在 postgresql 中使用 bcrypt 重新散列我的用户的密码而不在 php 中迭代它们?

问题描述

在我的数据库中,我使用弱哈希 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 重新哈希提供的密码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...