2013-07-07 1 views
-1

암호를 암호화하는 데 SHA-512를 사용하고 있습니다. 나는 모든 것을 올바르게하고 있다고 생각하며, 다른 곳에서도 성공적으로 코드를 복제한다고해도, 암호를 입력 할 때마다 데이터베이스에 저장된 내용과 일치하지 않는다.해시 된 암호를 확인할 수 없습니다.

$sql = "SELECT hashed_password FROM Users WHERE user_name='$username'"; 
$result = mysql_query($sql); 
$db_password = mysql_result($result, 0); 

if (crypt($currentPlaintext, $db_password) != $db_password) { 
    echo "Your current password is incorrect."; 
    die(); 
} 

나는 다음과 같은 명백한 잠재적 인 문제를 확인하고 원인으로 그들을 제거했다 :

1) 내 데이터베이스에 저장된 암호화 된 암호가 있습니다

2)이 암호를 검색 할 수 오전 변수 $ db_password에 저장하십시오.

3) $ username과 $ currentPlaintext 변수는 올바른 값을 가지고 있습니다.

그럼 왜이 기능이 작동하지 않습니까? 나는 명백한 것을 놓치고 있는가? 감사!

편집 : 지금까지 의견을 주셔서 감사합니다. 명확하게, crypt() 함수를 이해함에 따라, crypt의 두 번째 인수는 실제로 db에 저장된 전체 문자열입니다. 이 문자열에는 해시 된 암호뿐만 아니라 알고리즘, 소금 값 및 해싱 라운드 횟수가 포함됩니다. crypt() 함수는이 문자열에서 salt 값을 추출한 다음 첫 번째 인수를 해시하는 데 적용합니다. 결과는 이전 해시 된 암호와 비교됩니다. 그래서 이것이 너무 혼란 스럽습니다. 소금 값을 줄 필요가 없습니다. 소금이 데이터베이스에 있습니다. 이 함수에서 무슨 일이 일어나고 있는지 오해하고 있습니까?

crypt($plaintext, $pass) == $pass 

당신이 토굴의 두 번째 인수가 $salt 것을 볼 지하실 설명서를 보면 경우

$salt = uniqid(); 
$algo = '6'; 
$rounds = '5000'; 
$cryptSalt = '$' . $algo . '$rounds=' . $rounds . '$' . $salt; 
$hashedPassword = crypt($plaintext, $cryptSalt); 
+0

아마 소금으로 데이터베이스에서 암호화 된 암호를 사용하고 있습니까? ['crypt'] (http://us1.php.net/manual/en/function.crypt.php) – Jon

+0

편도 암호화에는 신뢰할 수있는 외부 소스를 사용하는 것이 가장 좋습니다. 내가 찾은 유용한 도구 : https://github.com/SlayerSolutions/Authentication/blob/master/Downloads/Version%202%20%28Class%29.php 또는 https://github.com/ircmaxell/PHP-PasswordLib –

+0

해쉬 된 암호가 어떻게 db에 들어 왔는지 알 필요가있는 의미있는 대답을하기 위해 어떻게 해시 되었습니까? 그리고 처음에 hashed_password를 생성 한 것과 같은 방식으로 crypt()가 currentPlaintext 암호를 실제로 해시 할 것입니다. 그래서 요약하면 의미있는 대답을하기 위해 해싱을 어떻게 처리하는지에 대한 정보는 거의 없습니다. –

답변

0

당신은 확인 :

나는 원래이 코드의 암호 해시. 따라서 해시를 만들 때 사용한 소금을 제공해야합니다. 소금을 사용하지 않는 경우 (이 작업을 수행해야 함)이 두 번째 인수를 제거하십시오.

0

Sha512를 사용하고 있습니까? 시스템에 따라 crypt()는 다른 알고리즘을 사용할 수 있습니다.

0

PHP의 crypt 함수가 반드시 SHA512 해시를 반환하지는 않습니다.

대신 hash('sha512', $currentPlaintext)을 사용하십시오.