2012-08-28 5 views
1

로그인 시스템을 만들고 비밀번호 인코딩에 crypt 함수를 사용하기 시작했습니다. 내 문제는 거기에 사용자와 암호를 모두 등록하면 사용자 이름 암호와 소금이 데이터베이스에 저장된다는 것입니다.같은 salt, password 및 복어로 다른 결과를 반환하는 crypt 함수

참고 : $ 2 :이 순간 그것이 실제 예를 암호 테스트로 나오면됩니다 그래서 corrrect 암호화

$username=$_POST["username"]; 
$password=$_POST["password"]; 


$salt = substr(md5(microtime()),rand(0,26),15); 
$hashedPass = crypt($password,'$2y$10$' . $salt); 


$sql="INSERT INTO `users`(`id`, `username`, `password`, `salt`, `Perm_level`) VALUES (NULL,'$username','$hashedPass','$salt','test')"; 
$result=mysql_query($sql); 

에서만 테스트 레지스터 페이지 여기 는 등록을위한 코드입니다 Y $ $ 10의 d395985a2ca993f의 $$$$$$ k8lxPkUCenMKsOJ6V8tdO6Pl/GL1/OW

과 소금를위한 것입니다. 내가 끌어 불구하고 로그인을 갈 때
d395985a2ca993f

소금을 데이터베이스에서 꺼내어 같은 방식으로 다시 암호화하려고 시도하지만 다른 암호화 된 암호를 얻습니다 ... 소금이 정확하므로 암호의 첫 부분이므로 "$ 2y $ 10 $ d395985a2ca993f $$ $$$$. " 여기

는 로그인 아래의 코드입니다 $ (2Y) $ $ 10의 d395985a2ca993f의 $ $ $ $ $ : 로그인 페이지 소금 여기 올바르지 만에

$sql="SELECT * FROM `users` WHERE username='$user'"; 
$result=mysql_query($sql); 

while($rows=mysql_fetch_array($result)){ 
$salt=$rows['salt']; 
} 

$hashedPass = crypt($password,'$2y$10$' . $salt); 

$sql="SELECT * FROM `users`WHERE username='$user' AND `password` = '$hashedPass'"; 
$result=mysql_query($sql); 

    if($result) { 
     if(mysql_num_rows($result) == 1) { 
      echo "Successful Login"; 

     } 
    } 

가 해시 된 후 암호입니다 $ .ccy3PKl.TsG26FWJBFXKmpQ3wtk4AqC는

전체 정류장 첫 번째 부분 위로는 단지 하반기 난 그냥에 대한 테스트를위한 ABC 같은 123 수동 하나에 소금을 설정하기 위해 노력했다

다른 올바른지 로그온 및 등록 페이지 b ut 여전히 동일한 오류가 있습니다

답변

0

값을 데이터베이스에 저장하면 이스케이프 처리해야합니다.

$escapeUserName= mysql_real_escape_string($username); 
$escapeHashedPass= mysql_real_escape_string($hashedPass); 
$escapeSalt= mysql_real_escape_string($salt); 

$sql="INSERT INTO `users`(`id`, `username`, `password`, `salt`, `Perm_level`) 
     VALUES (NULL,'$escapeUserName','$escapeHashedPass','$escapeSalt','test')"; 

그렇지 않으면 특수 문자가 제대로 삽입되지 않을 수 있으며 사용자가 겪을 수있는 문제가 발생합니다.


이러한 mysql 함수는 더 이상 사용되지 않으므로 대신 mysqli 또는 PDO를 사용해야합니다. 만약 당신이 매개 변수화 된 쿼리를 사용했다면, 당신을 위해 이스케이프를 처리 할 때 결코 일어나지 않았을 것입니다. 이것은 본질적으로 그것들을 더 안전하게 만든다. 이전 기능에 익숙해지기 전에 새로운 기능의 사용을 고려해야합니다.

0

코드에서 나는 복어 해시를 사용하는 것을 본다.

복어 해시를 사용할 때 염분은 base64로 인코딩해야하며 이어야합니다. 그 후에 점으로 '+'를 대체해야합니다.

소금은 22 자이어야합니다.

또한, 가장 좋은 방법은 올바른 해시 함수를 코딩 할 수 있습니다이 하나 http://www.openwall.com/phpass/

아주 소수의 사람들처럼 PHP 해싱 패키지를 사용하는 것입니다. 매우 진보 된 전문 지식이 필요합니다.

관련 문제