암호를 암호화하는 데 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);
아마 소금으로 데이터베이스에서 암호화 된 암호를 사용하고 있습니까? ['crypt'] (http://us1.php.net/manual/en/function.crypt.php) – Jon
편도 암호화에는 신뢰할 수있는 외부 소스를 사용하는 것이 가장 좋습니다. 내가 찾은 유용한 도구 : https://github.com/SlayerSolutions/Authentication/blob/master/Downloads/Version%202%20%28Class%29.php 또는 https://github.com/ircmaxell/PHP-PasswordLib –
해쉬 된 암호가 어떻게 db에 들어 왔는지 알 필요가있는 의미있는 대답을하기 위해 어떻게 해시 되었습니까? 그리고 처음에 hashed_password를 생성 한 것과 같은 방식으로 crypt()가 currentPlaintext 암호를 실제로 해시 할 것입니다. 그래서 요약하면 의미있는 대답을하기 위해 해싱을 어떻게 처리하는지에 대한 정보는 거의 없습니다. –