MySQL 4.0 의 password를 MySQL 4.1.x, 5.x, 5.7x 로 변경 > 그누보드5 팁자료실

그누보드5 팁자료실

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 두번 사용하더군요.
해피정님 이렇게 자세하게 알려주셔서 감사합니다. 처음 그누보드 다뤄봐서 막막했는데 덕분에 해결해서 너무 기뻤습니다 ^^
전체 2,427 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

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