php password_verify()가 false만 리턴합니다.


  • Level 3

    $db = mysqli_connect('localhost','root','test','level1');
    mysqli_set_charset($db, "utf8");

    if (isset($_POST['mb_id']) && isset($_POST['password'])){
    $user_id = mysqli_real_escape_string($db, $_POST['mb_id']);
    $pass1 = $_POST['password'];

    if (empty($user_id)){
    	header("location: login_view.php?error=아이디가 비어있어요.");
    	exit();
    } else if (empty($pass1)){
    	header("location: login_view.php?error=비밀번호가 비어있어요.");
    	exit();
    } else {
    	$sql = "select * from member where mb_id = '$user_id'";
    	$result = mysqli_query($db, $sql);
    	
    	if (mysqli_num_rows($result) === 1){
    		$row = mysqli_fetch_assoc($result);
    		$hash = $row['password'];
    		
    		// echo $hash."------";
    		// echo $pass1;
    		// echo var_dump(password_verify($pass1, $hash));
    		
    		if (password_verify($pass1, $hash)){
    			header("location: login_view.php?success=로그인에 성공하였습니다.");
    			//header("location: mypage/mypage.php");
    			exit();
    		} else {
    			header("location: login_view.php?error=로그인에 실패하였습니다.");
    			exit();
    		} 
    	}
    } 
    

    }

    코드는 위와 같습니다. DB의 password 길이는 256자입니다. password_verify()의 첫번째 항에 입력 받은 비밀번호, 두번째 항에는 암호화된 비밀번호를 넣었습니다. 그런데 계속 false가 반환됩니다.

    라이브러리에 password_verify()가 없어서 생기는 버그인 줄 알았는데, 없는 건 아니더라구요. password_verify($pass1, $hash) 대신에 password_verify($pass1, password_hash($pass1, PASSWORD_DEFAULT))를 사용하면 true가 나오긴 합니다.

    어디가 문제인지 모르겠습니다.

  • Level 10

    @장준영

    저는 별로 도움을 드리지 못한 것 같습니다 😞

    그래도 잘 해결되셨다니 다행입니다 🙂

    좋은 하루 되세요!

  • Level 3

    @Wynter password_hash($pass1, PASSWORD_DEFAULT)에서 $pass1을 넣었던게 원인이었네요 ㅜㅜ 다른 변수로 교체하니 잘 작동합니다. 제가 논리적 오류에 빠졌었네요. Wynter님께서 달아주신 코멘트가 큰 도움이 되었네요. 도움 주셔서 감사합니다.

  • Level 3

    @Wynter 아니요 출력값을 대조하니 육안상으로는 같다는 말이었습니다. var_dump로 비교했는데 둘 다 string(60)에 내용도 같아서 동일하다고 생각했습니다.

  • Level 10

    @장준영
    값이 같다고 하신게
    php의 비교연산자 === 를 통해 비교를 수행했을 때 같다는 결과가 나온건지 궁금합니다.

  • Level 3

    @Wynter $hash값과 password_hash($pass1, PASSWORD_DEFAULT)값은 서로 같습니다.
    방금전에 $hash = substr( $hash, 0, 60 ); 추가해보았는데 false만 리턴됩니다.

  • Level 10

    값이 똑같다면,

    $hash = substr( $hash, 0, 60 );

    이것을 추가해서 실행해보시겠어요?

    데이터베이스에 저장될때 자료형이 바뀌어서 생기는 문제일 수도 있을 것 같습니다.

    참고 링크

  • Level 10

    false가 반환되었으면, $hash값과 password_hash($pass1, PASSWORD_DEFAULT)값이 다를 것 같은데,

    두 값을 한 번 비교해보시겠어요?

  • Level 3

    @Wynter password_hash에 의해 생성된 값을 db에 삽입하고, 삽입된 hash 값을 $hash에 할당시켜주었는데 false가 반환됩니다.

  • Level 10

    안녕하세요.

    password_verify()의 두번째 인자로는 password_hash에 의해 생성된 문자열이어야 한다고 합니다.

    $hash의 값과 password_hash에 의해 생성된 값이 같은지 확인해보시겠어요?

ONLINE USERS

POPULAR TOPICS

SUGGESTED TOPICS