2017-02-01 1 views
1

작동하지 :이 VARCHAR (60)와 열에서 MySQL 데이터베이스에 저장됩니다password_verify() 나는과 같이 password_hash 사용하여 암호를 만든 PHP

$password = password_hash('password123', PASSWORD_DEFAULT);

.

if(password_verify($password, $foundUser->Password){ /*login*/ }

$password는 로그인 양식에서 일반 텍스트 입력입니다

하고 $foundUser->Password가 데이터베이스에 저장되어있는 해시이지만, password_verify() 함수는 항상 반환 : 내 로그인 폼에서

, 내가 사용 그릇된.

echo "Password: {$password} <br>"; echo "Found password: ".$foundUser->Password."<br>";

출력 :

Password: password123 Found password: $2y$10$8.ICQHCyCPzS.xygPO4cfuHsHZb6Kuxynn8/uUHOU1.7gY.UhSIXa

그래서 내가에 올바른 암호를 입력하고 받고 있어요 합리적으로 확신

는 다음 코드를 사용하여 내 입력을 확인했다 내 데이터베이스에서 올바른 해시.

답변을 찾기 위해 this question의 링크를 살펴 봤지만 아직 작동하지 않았습니다. 누구든지 password_verify()가 false를 반환하는 이유를 알고 있습니까?

+1

설명서에서 "결과를 60 자 이상으로 확장 할 수있는 데이터베이스 열에 저장하는 것이 좋습니다 (255자를 선택하는 것이 좋음)." –

+1

**'PASSWORD_DEFAULT'는 새롭고 강력한 알고리즘이 PHP에 추가됨에 따라 시간이 지남에 따라 변경되도록 설계되었습니다. 따라서이 식별자를 사용하여 얻은 결과의 길이는 시간이 지남에 따라 변경 될 수 있습니다. 따라서 결과를 60 자 이상으로 확장 할 수있는 데이터베이스 열에 저장하는 것이 좋습니다 (255자를 선택하는 것이 좋음). ** 처음부터 ... 데이터베이스에서 얻은 값이 정확히 'password_hash'가 생성 한 것과 같은 ...? – deceze

+0

... 현재'PASSWORD_DEFAULT'는 BCrypt를 사용하지만 그래도 반드시 60 자 문자열이어야합니다. – CD001

답변

0

암호화 된 암호 문자가 100을 초과 할 수 있으므로 데이터베이스 열 값이 60 이상이됩니다. $ password = password_hash ('password123', PASSWORD_DEFAULT); 이 함수는 매번 변경 될 수있는 암호화 된 암호를 반환합니다.

0

password_hash() 함수에 대한 PHP 매뉴얼에는주의가 있습니다. PASSWORD_BCRYPT를 알고리즘으로 사용하면 password 매개 변수가 최대 72 자 길이로 잘립니다. 이 부분을 읽어주십시오 http://php.net/manual/en/function.password-hash.php

아마도 mysql 열을 varchar (60)에서 varchar (73) 이상으로 변경해야합니다. 또한 유형 텍스트를 사용할 수 있습니다.

+0

password_hash() 함수는 암호를 72 자로 자르지 만 문제없이 작동합니다. 해시는 여전히 BCrypt 해시 (' '$ 2y $ 10 $ ...')의 경우 60 자입니다. – martinstoeckli

0

내 문제는 해결되었습니다. @martinstoeckli 및 @Narf 제안에 따라 디버깅하는 방식을 변경했으며 문제가 password_verify()가 아니라 출력을 처리하는 방식으로 문제가 있음을 확인했습니다. 도망 가지 마시고 죄송합니다. 모든 도움에 감사드립니다.