0

我已经搜索了一个小时,但我无法让它工作。

我有一个名为user2 列的表username varchar(64),并且password binary(20). 我正在使用 SHA1 加密,因为我想让它变得又快又脏。

mysql> describe user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(64) | NO   | PRI | NULL    |       |
| password | binary(20)  | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

当我想验证用户的密码时,我遇到了一些麻烦。我没有得到二进制的结果密码。有什么建议么?谢谢。

$username = mysql_real_escape_string($_POST['username']);
$password = sha1(mysql_real_escape_string($_POST['password']));
$binPass = pack("H*", $password);
$query = "SELECT * FROM `user` WHERE `username` = '$username' AND `password` = $binPass;";
4

1 回答 1

0

计算 sql 转义密码的校验和是没有意义的。您想要计算原始密码的校验和,并且由于您在查询中使用二进制数据,因此必须在将mysql_real_escape_string其包含在查询中之前对其进行转义,否则您会得到意想不到的结果。

$username = mysql_real_escape_string($_POST['username']);
$password = sha1($_POST['password']);
$binPass = mysql_real_escape_string(pack("H*", $password));
$query = "SELECT * FROM `user` WHERE `username` = '$username' AND `password` = '$binPass'"

通过将其以二进制形式存储在数据库中,您将节省 50% 的空间,但性能提升最多是最小的。您应该考虑只将十六进制校验和存储在数据库中。

于 2012-12-09T04:34:51.410 回答