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 자리입니다.
답변을 작성하시기 전에 로그인 해주세요.