mysql 데이터베이스에 사용자 이름과 암호화 된 비밀번호를 저장합니다. 테스트 용으로 암호를 데이터베이스에 암호화되지 않은 형식으로 저장합니다.PHP password_verify는 하나의 문자열로 작동하지만 다른 것으로 간주되지 않습니다.
다음 코드에서 해시 된 암호와 데이터베이스의 암호화되지 않은 암호를 얻습니다. 그런 다음 암호화되지 않은 암호를 암호화합니다.
주어진 암호가 저장된 해시 또는 새 해시에 대한 암호 확인 테스트를 통과하지 못합니다.
저장된 암호는 저장된 해시와 새 해시 모두에 대한 암호 확인 테스트를 통과합니다.
strcmp를 호출하면 저장된 암호와 주어진 암호가 같다고 표시됩니다.
어떻게 될 수 있습니까?
[편집] 웹 페이지의 사용자 입력에서 $ password를 전달 중입니다.
// get hashed password from database
$sql = "SELECT member_password FROM member WHERE member_username=:username;";
$stmt = $db->prepare($sql);
$stmt->bindParam("username", $username);
$stmt->execute();
$hash = $stmt->fetch(PDO::FETCH_ASSOC);
$hash = $hash["member_password"];
// get unencrypated password from database
$sql = "SELECT member_unencrypted FROM member WHERE member_username=:username;";
$db = getConnection();
$stmt = $db->prepare($sql);
$stmt->bindParam("username", $username);
$stmt->execute();
$unencrypted = $stmt->fetch(PDO::FETCH_ASSOC);
$unencrypted = $unencrypted["member_unencrypted"];
// encrypt the unencrypted password that was retrieved from the database
$encrypted = password_hash($unencrypted, PASSWORD_DEFAULT);
// given password does not pass the new hash per this test
if(password_verify($password, $encrypted))
echo '<br>given password passed new hash';
else
echo '<br>given password did not pass new hash';
// stored password does pass the new hash per this test
if(password_verify($unencrypted, $encrypted))
echo '<br>stored password passed new hash';
else
echo '<br>stored password did not pass new hash';
// given password does not pass the stored hash per this test.
if(password_verify($password, $hash)){
echo '<br>given password passed stored hash';
else
echo '<br>given password did not pass stored hash';
// stored password does pass the stored hash per this test.
if(password_verify($unencrypted, $hash))
echo '<br>stored password passed stored hash';
else
echo '<br>stored password did not pass stored hash';
// stored and given passwords are equal per this test.
if(strcmp($unencrypted, $password))
echo '<br>stored and given passwords are equal';
else
echo '<br>stored and given passwords are not equal';
출력 :
given password did not pass new hash
stored password passed new hash
given password did not pass stored hash
stored password passed stored hash
stored and given passwords are equal
해시를 저장하는 데 사용되는 열의 구조는 무엇입니까? – Mike
또한 테스트 때문에 간단하게 수행하고 있는지 잘 모르겠지만 두 쿼리를 쉽게 결합 할 수 있습니다. 그리고 단일 값을 선택할 때'$ hash = $ stmt-> fetch (PDO :: FETCH_ASSOC)와 같은 것들 대신'fetchColumn()'을 사용해야합니다; $ hash = $ hash [ "member_password"]; ' – Mike
팁 마이크에게 감사드립니다! SQL을 많이 작성한 이후로 꽤 오랜 시간이 걸렸습니다. 유용합니다. 해시는 VARCHAR (255)에 저장됩니다. – brucebolick