common.lib.php안에 login_password_check함수 질문 채택완료
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 포인트
5년 전
질문자님이 뭔가를 잘못 알고 있는것 같네요.
mysql password 길이는 41 자리이며,
mysql old password 길이는 16 자리이고,
그누보드 5.4 버전부터 적용된 pbkdf2 의 경우 길이는 78 자리입니다.
로그인 후 평가할 수 있습니다
답변에 대한 댓글 2개
그누보드이해하기
5년 전
5년 전
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
그누보드5.4 버전부터는 암호화가 pbkdf2 으로 변경되고,
그누보드5.3 버전 포함 이하버전은 mysql password 를 쓰고 있었습니다.
mb_password2는 사용을 안하는 필드입니다.
mb_password2 는 사용 안하며, 그누보드5.3 이하 버전에서 그누보드 5.4 버전으로 업데이트를 한 경우, 문제가 생길수도 있어서 mysql password 값을 따로 저장하는 용도로 쓰입니다.
아래 링크 보시면 됩니다.
https://sir.kr/g5_tip/12284
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
mb_password 는 78자리고
mb_password2 는 41 자리입니다.
그런데 mb_password2에 $hash가 들어가는 건 맞지 않나요?
mb_password2 에는 콜론이 없는데 어떻게 분할을 하는건가요..?