2012-12-09 6 views
0

나는 한 시간 동안 검색을 해왔다.PHP MySQL 바이너리 선택

나는 이라는 테이블과 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

16 진수 문자열 대신 이진 blob로 저장하는 이유는 무엇입니까? 당신은 이미 그것을 가지고 있으며 그것을 사용할 수도 있습니다. 또한 배 트리에서 bcrypt/pbkdf2/scrypt/partridges를 무조건 SHA1보다 더 나은 옵션으로 지정해야합니다. – Charles

+0

나는이 [answer] (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 % 절약 할 수 있지만 성능은 향상되지 않습니다. 대신 데이터베이스에 16 진수 체크섬을 저장하는 것을 고려해야합니다.