common.lib.php안에 login_password_check함수 질문 채택완료

5년 전 조회 6,131

Copy
// 로그인 패스워드 체크

function login_password_check($mb, $pass, $hash)

{

    global $g5;

 

    $mb_id = isset($mb['mb_id']) ? $mb['mb_id'] : '';

 

    if(!$mb_id)

        return false;

 

    if(G5_STRING_ENCRYPT_FUNCTION === 'create_hash' && (strlen($hash) === G5_MYSQL_PASSWORD_LENGTH || strlen($hash) === 16)) {

        if( sql_password($pass) === $hash ){

 

            if( ! isset($mb['mb_password2']) ){

                $sql = "ALTER TABLE `{$g5['member_table']}` ADD `mb_password2` varchar(255) NOT NULL default '' AFTER `mb_password`";

                sql_query($sql);

            }

            

            $new_password = create_hash($pass);

            $sql = " update {$g5['member_table']} set mb_password = '$new_password', mb_password2 = '$hash' where mb_id = '$mb_id' ";

            sql_query($sql);

            return true;

        }

    }

 

    return check_password($pass, $hash);

}

 

이 코드에서 암호화 방식이 create_hash이면서 회원정보(DB)에 있는 비밀번호의 길이가 41이거나 16일 때

$new_password 변수에는 입력한 password 값을 암호화 하고

mb_password 칼럼에 $new_password 값을 넣고

mb_password2 칼럼에 DB에 있는 비밀번호를 넣는다고 이해를 했는데

 

db를 확인하니 mb_password는 41, mb_password2는 16자리입니다.

제가 궁금한건 return check_password 함수안에 validate_password 함수내용입니다.

 

Copy
// check_password함수 내용

function check_password($pass, $hash)

{

    if(defined('G5_STRING_ENCRYPT_FUNCTION') && G5_STRING_ENCRYPT_FUNCTION === 'create_hash') {

        return validate_password($pass, $hash);

    }

 

    $password = get_encrypt_string($pass);

 

    return ($password === $hash);

}

 이 코드에서 첫번 째 if문 안에 validate_password라는 함수가 있습니다.

 

Copy
//validate_password 함수 내용

function validate_password($password, $hash)

{

    // Split the hash into 4 parts.

    

    $params = explode(':', $hash);

    if (count($params) < 4) return false;

    

    // Recalculate the hash and compare it with the original.

    

    $pbkdf2 = base64_decode($params[3]);

    $pbkdf2_check = pbkdf2_default($params[0], $password, $params[2], (int)$params[1], strlen($pbkdf2));

    return slow_equals($pbkdf2, $pbkdf2_check);

}

 

여기서 $params변수 안에 콜론을 기준으로 $hash의 비밀번호를 분할 합니다.

근데 $hash는 16자리입니다.

비밀번호 형식에 콜론을 가지고 있는 건 41자리 입니다.

어떻게 된건지 도와주세요~~

답변 1개

채택된 답변
+20 포인트

질문자님이 뭔가를 잘못 알고 있는것 같네요.

 

mysql password 길이는 41 자리이며,

mysql old password 길이는 16 자리이고,

 

그누보드 5.4 버전부터 적용된 pbkdf2 의 경우 길이는 78 자리입니다.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

DB를 보니까 이제 16자리는 사용이 안되는거 같아요.
mb_password 는 78자리고
mb_password2 는 41 자리입니다.

그런데 mb_password2에 $hash가 들어가는 건 맞지 않나요?
mb_password2 에는 콜론이 없는데 어떻게 분할을 하는건가요..?
mysql8 버전이상부터는 mysql password 함수가 사라져서,

그누보드5.4 버전부터는 암호화가 pbkdf2 으로 변경되고,
그누보드5.3 버전 포함 이하버전은 mysql password 를 쓰고 있었습니다.

mb_password2는 사용을 안하는 필드입니다.

mb_password2 는 사용 안하며, 그누보드5.3 이하 버전에서 그누보드 5.4 버전으로 업데이트를 한 경우, 문제가 생길수도 있어서 mysql password 값을 따로 저장하는 용도로 쓰입니다.

아래 링크 보시면 됩니다.

https://sir.kr/g5_tip/12284

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인
🐛 버그신고