2012-12-09 76 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%,但業績增長將是最小的最好的。您應該考慮將相應的十六進制校驗和存儲在數據庫中。