| CMS/프레임워크 | Rhymix 2.1 |
|---|---|
| 개발 언어 | PHP 7.4 |
신청폼에서 본인확인 위한 비번 매칭 방법 문의 합니다.
php7.4v 으로 만든 신청폼을 rhymix 위젯페이지에 넣어 사용하는데요, 신청폼에 신청자 본인확인을 위해 로그인비번을 입력하면 멤버테이블의 비번과 비교하여 매칭되면 본인확인완료로 통과시키는 절차 입니다..
아래는 rhymix 에서 비번을 만드는 소스인것 같습니다.
$oPwd = new \Rhymix\Framework\Password();
$strNewPwd = $oPwd->hashPassword("test1234");
이렇게 만들어진 비번($strNewPwd)과 멤버테이블의 비번을 매칭(비교)하는 방법이 있는지요?
똑같은 비밀번로라도 비밀번호 암호화가 되는 시점마다 해시코드가 다르다고 하는데 회원테이블에 입력되어 있는 비번과 방금 입력하여 만들어진 비번의 해시코드가 다를것 같은데 이 둘을 매칭(비교)하는 방법이 있는지요?
xone
Lv. 1
댓글 6
checkPassword 함수가 바로 그런 목적으로 사용하는 함수입니다.
static 함수라서 \Rhymix\Framework\Password::checkPassword($string, $hash) 처럼 쓰면 됩니다. (string에 원본 비번, hash에 해시된 비번)
3번째 인자로 알고리즘을 넘길수 있지만 생략하면 알아서 찾아줍니다.
$stmt = $link->prepare("SELECT * FROM xe_member WHERE user_id = ? ");
~~ ~~ 생략
$mempass //password 칼럼값.
$inputHashPwd //입력해서 생성한 해시값.
$is_matched = \Rhymix\Framework\Password::checkPassword($mempass, $inputHashPwd) ;
if ($is_matched) {
echo "비교 일치";
} else {
echo "비교 불일치";
}
비교 불일치 나오는데요. 알려주신 비교함수를 제가 잘못 사용한건지 검수 부탁합니다..
$is_matched = Rhymix\Framework\Password::verify($inputHashPwd, $member_info->password);
이거로도 에러 발생합니다.
첫번째 인자에 "해시되지 않은 비번 원본", 두번째 인자에 DB에 저장된 비밀번호 해시를 넣습니다. 잘못 사용하셨네요. 비밀번호를 해시할 필요 전혀 없습니다.
비교일치 성공..진심으로 감사합니다. 궁금한것이 암호를 생성할때 마다 다르게 생성되는 해시값과 테이블의 고정된 password 값과 매칭하는 원리에 대해 찾아 볼수 있는 힌트 좀 알려주실 수 있는지요?
https://github.com/rhymix/rhymix/blob/7c07341e0545e07aa78000113fb7d41d76a5fa12/common/framework/Password.php#L374-L399
해시 알고리즘이 argon2id나 bcrypt라면 php 내장 함수인 password_verify를 사용합니다.(argon2id는 매 해시마다 다른 해시가 나오므로, bcrypt는 php 내장함수를 쓰는 편이 안전하므로)
https://github.com/rhymix/rhymix/blob/master/common/framework/Security.php#L302-L316
이외 경우 compareStrings 함수를 사용해 해시한 비번과 원본 해시를 비교하는데 내부적으로 hash_equals 함수를 사용하도록 되어 있습니다.(없는 경우 자체 구현 사용) 단순히 ===를 사용하지 않는 이유는 틀린 부분이 나와도 일정 시간동안 비교하게 만들어서 타이밍 공격(Timing Attack - 해시가 얼마나 다르냐에 따라 비교 시간이 ms 단위로 달라지는것을 이용하는 공격법)을 방지합니다.
비밀번호 암호화에 소금(salt)을 치는 방법을 검색해 보시면 유용한 정보가 많이 나올 거예요.
DB에 저장된 해쉬값이 유출되더라도 원본을 유추하기 최대한 어렵게 만들기 위해 고안된 방법입니다.