2012-12-09 71 views
0

我一直在寻找一个小时左右,我无法得到这个工作。PHP MySQL二进制选择

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

为什么你将它存储为二进制blob而不是十六进制字符串?你已经有了它,不妨使用它。此外,这是一个强制提及梨树中的bcrypt/pbkdf2/scrypt/partridges作为比无盐SHA1更好的选项。 – Charles

+0

我基于我的密码存储这个[答案](http://stackoverflow.com/a/247627/1762224)。 –

回答

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%,但业绩增长将是最小的最好的。您应该考虑将相应的十六进制校验和存储在数据库中。