MySQL 4.0 의 password를 MySQL 4.1.x, 5.x, 5.7x 로 변경 정보
MySQL 4.0 의 password를 MySQL 4.1.x, 5.x, 5.7x 로 변경관련링크
본문
제로보드와 GNU보드 둘다 회원들의 password를 관리할때 MySQL의 password()를 사용하는데 이 함수가 4.0이하와 4.1이상에서 다른 hashing value를 가집니다. 다 아시겠지만 4.0이하는 16바이트,
4.1이상은 40바이트의 hashed value를 가집니다.
패스워드가 모두 옛날 password()함수로 되어있습니다.
최근에 호스트쪽에서 MySQL 4.1.X로 업그레이드를 해서 지금 설치된 그누보드는 password()를 쓸때에 모두 16바이트 대신 40바이트의 hashed value를 돌려주게 됩니다.
즉, 회원정보를 옮겨오면 로그인이 안되는것이죠.
다음과 같이하면 됩니다.
2019-02-13
mysql 5.7 이상일때 old_password 함수가 제거되어 그것에 대응하는 코드를 추가했습니다.
1. 그누보드5 / lib / common.lib.php 155~1560줄
function sql_password($value)
{
// mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
// mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
$row = sql_fetch(" select password('$value') as pass ");
return $row['pass'];
}
를 아래와 같이 내용 추가
// mysql 5.7 미만일때
/*function sql_old_password($value)
{
$row = sql_fetch(" select old_password('$value') as pass ");
return $row['pass'];
}*/
// mysql 5.7 이상일때
function sql_old_password($value) {
if ($value == '')
return '';
$nr = 1345345333;
$add = 7;
$nr2 = 0x12345671;
foreach(str_split($value) as $c) {
if ($c == ' ' or $c == "\t")
continue;
$tmp = ord($c);
$nr ^= ((($nr & 63) + $add) * $tmp) + (($nr << 8) & 0xFFFFFFFF);
$nr2 += (($nr2 << 8) & 0xFFFFFFFF) ^ $nr;
$add += $tmp;
}
if ($nr2 > PHP_INT_MAX)
$nr2 += PHP_INT_MAX + 1;
$bit = (1 << 31) -1;
return sprintf("%08lx%08lx", $nr & $bit, $nr2 & $bit);
}
function sql_password($value)
{
// mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
// mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
$row = sql_fetch(" select password('$value') as pass ");
return $row[pass];
}
2-1. 그누보드5.2 / bbs / login_check.php 32~33줄
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
를 아래와 같이 변경
//if (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) {
// alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
//}
if (sql_old_password($mb_password) == $mb['mb_password']) { // 옛날 패스워드를 새로운 패스워드로 바꿉니다.
$sql = " update {$g5['member_table']} set mb_password='".sql_password($mb_password)."' where mb_id='{$mb_id}' ";
sql_query($sql);
} elseif (!$mb['mb_id'] || (sql_password($mb_password) != $mb['mb_password'])) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
2-2. 그누보드5.3 / bbs / login_check.php 32~33줄
if (!$is_social_password_check && (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) ) {
alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}
를 아래와 같이 변경
//if (!$is_social_password_check && (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) ) {
// alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
//}
if (sql_old_password($mb_password) == $mb['mb_password']) { // 옛날 패스워드를 새로운 패스워드로 바꿉니다.
$sql = " update {$g5['member_table']} set mb_password='" . sql_password($mb_password) . "' where mb_id='{$mb_id}' ";
sql_query($sql);
} elseif (!$is_social_password_check && (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) ) {
alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}
3-1. 그누보드5.2 / bbs / password_check.php 9~10 줄
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된 16byte 패스워드을 허용하면서 41byte 로 변경 저장하기
if (sql_password($wr_password) != $wr[wr_password])
alert("패스워드가 틀립니다.");
를 아래와 같이 변경
//if (sql_password($wr_password) != $wr[wr_password])
// alert("패스워드가 틀립니다.");
if (sql_old_password($wr_password) == $wr['wr_password']) { // 옛날 패스워드를 새로운 패스워드로 바꿉니다.
$sql = "update {$g5['write_prefix']}{$bo_table} set wr_password='".sql_password($wr_password)."' where wr_id='{$wr_id}' ";
sql_query($sql);
} elseif (sql_password($wr_password) != $wr['wr_password']) {
alert("패스워드가 틀립니다.");
}
3-2. 그누보드5.3 / bbs / password_check.php 의9~10 줄
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된 16byte 패스워드을 허용하면서 41byte 로 변경 저장하기
if (!check_password($wr_password, $wr['wr_password']))
alert('비밀번호가 틀립니다.');
를 아래와 같이 변경
//if (!check_password($wr_password, $wr['wr_password']))
// alert('비밀번호가 틀립니다.');
if (sql_old_password($wr_password) == $wr['wr_password']) { // 옛날 패스워드를 새로운 패스워드로 바꿉니다.
$sql = "update {$g5['write_prefix']}{$bo_table} set wr_password='".sql_password($wr_password)."' where wr_id='{$wr_id}' ";
sql_query($sql);
} elseif (!check_password($wr_password, $wr['wr_password'])) {
alert("패스워드가 틀립니다.");
}
4
댓글 7개
가끔 리뉴얼하는 사이트가 옛날 그누보드인경우 회원패스워드때문에 힘들때가 있었어요.
좋은정보 감사합니다.
select password('$value') as pass ....... 이 문장은 my-sql 상위버전에서는 삭제 된 함수 사용으로 문제가 있습니다.
하지만 서버이전 및 mysql 버전 업그레이드로 저 함수로 저장된 패스워드를 사용해야 할때는
/lib/common.lib.php 의
select password('$value') as pass 을
아래 문법으로 대체 해주시면 됩니다.
SELECT CONCAT('*',UPPER(SHA1(UNHEX(SHA1('$value'))))) AS pass
하위 mysql의 password 보안 방법을 찾아보니 Sha-1 두번 사용하더군요.
아주 유용하게 사용했습니다