【问题标题】:PHP MySQL Binary selectPHP MySQL 二进制选择
【发布时间】:2012-12-09 02:20:06
【问题描述】:

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

我有一个名为user 的表,其中有两列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;";

【问题讨论】:

  • 为什么将其存储为二进制 blob 而不是十六进制字符串?你已经拥有了,不妨使用它。此外,这是强制提及梨树中的 bcrypt/pbkdf2/scrypt/partridges 作为比无盐 SHA1 更好的选择。
  • 我的密码存储基于此answer

标签: php mysql binary sha1


【解决方案1】:

计算 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% 的空间,但性能提升最多是最小的。您应该考虑只将十六进制校验和存储在数据库中。

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多