首先,在生产环境中进行之前在开发机器上尝试所有这些东西,并在生产环境中进行之前备份数据库。像这样的迁移脚本是丢失数据的最简单方法。
1)在您的数据库(类型ENUM
)中创建一个字段,说明密码字段的加密类型。将默认值设置为“未加密”
如果你没有这个,并且更新脚本由于某种原因失败,你将得到一个半散列的数据库。
怎么做:
ALTER TABLE application.users
ADD password_type ENUM('unencrypted', 'SHA256') NOT NULL;
2)制作一个查找1个未加密密码的php脚本,并对其进行哈希/盐/存储。
<?php
mysql_connect("hostname", "user", "pass") or die(mysql_error());
mysql_select_db("application") or die(mysql_error());
// Get all the data from the "example" table
$result = mysql_query("SELECT * FROM users WHERE password_type = 'unencrypted'")
or die(mysql_error());
// keeps getting the next row until there are no more to get
$row = mysql_fetch_array( $result );
$pw = $row['password'];
$id = $row['user_id_num'];
$id = (int) $id;
$hashed_password = hash("sha256", $pw);
mysql_query("UPDATE users SET password_type = 'SHA256' AND SET password = '$hashed_password' WHERE user_id_num = $id")
or die(mysql_error());
?>
3) 将该脚本更改为一次执行 100 个。
cron
4)每分钟使用 linux 工具启动脚本。保留它直到整个数据库被散列。
请注意,我对数据库中的内容名称做了一些假设。