common.lib.php안에 login_password_check함수 질문

common.lib.php안에 login_password_check함수 질문

QA

common.lib.php안에 login_password_check함수 질문

본문


// 로그인 패스워드 체크
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 함수내용입니다.

 


// 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라는 함수가 있습니다.

 


//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

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

 

mysql password 길이는 41 자리이며,

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

 

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

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

답변을 작성하시기 전에 로그인 해주세요.
전체 16
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT