1

我有个问题。

我是一名新手程序员,大约一年前我开始自学php来编写应用程序。

像所有新手一样,我犯了一些重大错误,这些错误在应用程序启动后才意识到。

诸如缺少外键未加密的cookie存储密码之类的事情……等等。

现在,在您判断我之前,我已经让应用程序正常工作了,我并没有预期应用程序会运行良好,并且期望用户数远低于 500。

现在一年和 25k 用户之后,我发现自己陷入了困境,我改进了原始代码,做了所有必要的安全改进,还有什么没有,我准备推出 2.0 版本。

问题是密码以纯文本形式存储在mysql中。在我启动 2.0 版本后,密码将被加盐和 sha256'd。问题是我如何更新现有记录,以便我可以对它们进行 slat 和加密。

我需要从 mysql 中提取每个密码,通过脚本运行它并将它们再次保存回数据库。最好的方法是什么?

提前致谢。

4

2 回答 2

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
    }
?>

现在有 25,000 个用户,您可能希望错开它.. 一次做 1000 个。我假设您已为您的用户分配了 ID。所以只需“从 id < 0 和 id > 1000 的用户中选择 *”并增加条件中的数字以通过所有用户。

于 2012-07-31T21:34:21.060 回答
1

首先,在生产环境中进行之前在开发机器上尝试所有这些东西,并在生产环境中进行之前备份数据库。像这样的迁移脚本是丢失数据的最简单方法。

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 个。

cron4)每分钟使用 linux 工具启动脚本。保留它直到整个数据库被散列。

请注意,我对数据库中的内容名称做了一些假设。

于 2012-07-31T22:13:22.790 回答