커뮤니티

CMS/프레임워크 Rhymix 2.1
개발 언어 PHP 7.4

신청폼에서 본인확인 위한 비번 매칭 방법 문의 합니다.

php7.4v 으로 만든 신청폼을 rhymix 위젯페이지에 넣어 사용하는데요, 신청폼에 신청자 본인확인을 위해 로그인비번을 입력하면 멤버테이블의 비번과 비교하여 매칭되면 본인확인완료로 통과시키는 절차 입니다.. 

아래는 rhymix 에서 비번을 만드는 소스인것 같습니다.

$oPwd = new \Rhymix\Framework\Password();
    $strNewPwd = $oPwd->hashPassword("test1234");

이렇게 만들어진 비번($strNewPwd)과  멤버테이블의 비번을 매칭(비교)하는 방법이 있는지요?

 

똑같은 비밀번로라도 비밀번호 암호화가 되는 시점마다 해시코드가 다르다고 하는데  회원테이블에 입력되어 있는 비번과 방금 입력하여 만들어진 비번의 해시코드가 다를것 같은데 이 둘을 매칭(비교)하는 방법이 있는지요?

 

xone Lv. 1

댓글 11

  • checkPassword 함수가 바로 그런 목적으로 사용하는 함수입니다.

     

    static 함수라서 \Rhymix\Framework\Password::checkPassword($string, $hash) 처럼 쓰면 됩니다. (string에 원본 비번, hash에 해시된 비번)

     

    3번째 인자로 알고리즘을 넘길수 있지만 생략하면 알아서 찾아줍니다.

  • @YJSoft

    $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);

    이거로도 에러 발생합니다.

     

  • @xone

    첫번째 인자에 "해시되지 않은 비번 원본", 두번째 인자에 DB에 저장된 비밀번호 해시를 넣습니다. 잘못 사용하셨네요. 비밀번호를 해시할 필요 전혀 없습니다.

  • @YJSoft

    비교일치 성공..진심으로 감사합니다.  궁금한것이 암호를 생성할때 마다 다르게 생성되는 해시값과  테이블의 고정된 password 값과 매칭하는 원리에 대해 찾아 볼수 있는 힌트 좀 알려주실 수 있는지요?

  • @xone

    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 단위로 달라지는것을 이용하는 공격법)을 방지합니다.

  • @YJSoft

    와우..감사합니다. 한가지만 더 물어봐도 되겠는지요. Password.php 파일안에 클래스와 함수들은 순수 php 전용코드(문법)로 작성된 것인지 아니면 고유의 php코드에 xe(rhymx)만의 문법을 가미(추가)한 것인지요?

  • @xone

    php 코드에서 "XE(Rhymix)만의 문법"이라는건 존재하지도 않고 별도의 인터프리터를 만들지 않는한 쓸 수도 없습니다. 라이믹스에서 도입한 네임스페이스, 클래스, PSR-4 같은 기술들은 전부 PHP 표준 기술입니다. 자세한건 GPT같은 LLM에게 물어보시면 요즘은 잘 답변해줄겁니다.

  • @YJSoft

    네, 감사합니다. 저는 xe 처음 접했을때 XE 문법으로 만들었다고 해서 xe코드들이 php와 전혀 다른것 같이 보여서 겁먹고 배울생각도 못해거든요. php 표준만 알게되면 rhymix 모듈도 만들수 있겠네요.

  • @xone

    스킨에서 주로 사용하는 템플릿 문법은 일반 PHP와는 다른 고유의 문법이라고 부를 만한 여지가 있습니다. 어떤 언어, 어떤 프레임워크라도 템플릿 문법은 다 다르더군요. 대부분의 사용자분들은 간단한 스킨 수정을 먼저 접하기 때문에, PHP와 다르다는 인상을 받으셨더라도 이해해요.

     

    그러나 Password.php처럼 내부적인 처리를 맡고 있는 파일들은 모두 순도 100% PHP입니다.

  • @xone

    비밀번호 암호화에 소금(salt)을 치는 방법을 검색해 보시면 유용한 정보가 많이 나올 거예요.

    DB에 저장된 해쉬값이 유출되더라도 원본을 유추하기 최대한 어렵게 만들기 위해 고안된 방법입니다.

  • @기진곰

    감사합니다. 구글이 답변을 잘해주네요. 저는 지금까지 md5 에 머물러 있었네요. md5는 구석기 알고리즘이 되었나 봅니다.