我有一个问题。
我是菜鸟程序员,大约一年前我开始自己学习php来编写应用程序。
像所有新手一样,我在应用程序启动后发现了一些重大错误。缺少外键等未加密的cookie存储密码....等等。
现在,在你判断我之前,我得到了应用程序,我还没有预料到应用程序,并且预计远低于500个用户。
现在一年和25k用户后来我发现自己处于绑定状态,我已经改进了原始代码,进行了所有必要的安全性改进以及什么不是,我准备启动2.0版本。
问题是密码以纯文本形式存储在mysql中。在我启动2.0版本后,密码将被盐渍并且sha256。问题是如何更新现有记录,以便我可以对它们进行板条和加密。
我需要从mysql中提取每个密码,然后通过脚本运行它并再次将它们保存回数据库。什么是最好的方法呢?
提前谢谢。答案 0 :(得分:2)
这里没有什么神奇之处。您可以编写一段PHP代码来执行更新过程。基本上你要做的是......
<?php
select * from users
for each (user row in database) {
work on 'password' to get 'new password'
update users set password='new password' where id=id
}
?>
现在有25k用户你可能希望错开它......也许每次做1000次。我假设你已经为你的用户分配了ID。所以只需“选择*来自id&lt; 0和id&gt; 1000的用户”并在条件中增加数字以通过所有用户。
答案 1 :(得分:1)
首先,在开始生产之前在开发机器上尝试所有这些东西,并在生产之前备份数据库。像这样的迁移脚本是丢失数据的最简单方法。
1)在数据库(类型为ENUM
)中创建一个字段,说明密码字段的加密类型。将默认值设为“未加密”
如果您没有这个,并且更新脚本由于某种原因失败,您将留下半散列数据库。
如何做到这一点:
ALTER TABLE application.users
ADD password_type ENUM('unencrypted', 'SHA256') NOT NULL;
2)创建一个php脚本,查找1个未加密的密码,并使用hashs / salts /存储它。
<?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个。
4)每分钟使用linux工具cron
启动脚本。保留它直到整个数据库被散列。
请注意,我已经对数据库中的内容名称做了一些假设。