[G4/G5] MySQL 4.0 의 password(16byte)를 MySQL 4.1.x, 5.x, 5.7x (41byte) 또는 create_hash 로 변경 > 기술자료 | 해피정닷컴

[G4/G5] MySQL 4.0 의 password(16byte)를 MySQL 4.1.x, 5.x, 5.7x (41byte) 또는 create_hash 로 변경 > 기술자료

본문 바로가기

사이트 내 전체검색

[G4/G5] MySQL 4.0 의 password(16byte)를 MySQL 4.1.x, 5.x, 5.7x (41byte) 또는 create_hash 로 변경 > 기술자료

그누보드 [G4/G5] MySQL 4.0 의 password(16byte)를 MySQL 4.1.x, 5.x, 5.7x (41byte) 또는 create_hash 로 변경

페이지 정보


본문

제로보드와 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 함수가 제거되어 그것에 대응하는 코드를 추가했습니다.

2019-12-17
그누보드 5.4 의 새로운 암호화 방식인 PBKDF2 대응 코드 추가
기존 16비트 암호 mb_password 필드의 값은 PBKDF2 로 변경되고, mb_password2 에는 41바이트 형식의 암호로 변경 저장

2020-11-21
비밀번호 체크 로직개선

2021-01-06
그누보드 5.4 에서 도입된 create_hash 에 대한 패스워드 대응코드가 추가

2021-05-11
mysql 5.1.45 에서 버전 확인 안되는 현상이 확인되어 그것에 대응하는 코드를 lib/common.lib.php 를 수정

2021-11-05
그누보드4 쿼리 최적화 작업

2023-06.12
그누보드5.5.8.2.5 ~ / bbs / login_check.php  수정

2024-03-28
sql_fetch("SELECT VERSION() AS version");
mariaDB 10.6 에서 문제발생 확인되어 common.lib.php 내용변경

2024-03-29
mysql 8.0 / mariaDB 12.4 이상일때 암호 대응 코드 추가


Ⅰ. 그누보드 5


1. 그누보드5 / lib / common.lib.php
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'];
}

아래에 내용을 추가합니다

// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- Start --
// mysql 클라이언트 버전확인함수 (by happyjung.com)
//error_reporting( E_ALL );
//ini_set( "display_errors", 1 );

// mysql 5.0 미만일때
//$row_sql_version = sql_fetch("SELECT VERSION() AS version");

// mysql 5.7 이상이거나 mariaDB 10.2 이상일때
$mysqli = new mysqli(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD, G5_MYSQL_DB);
$sql_version_qry = $mysqli->query("SELECT VERSION() as version");
$sql_version_row = $sql_version_qry->fetch_assoc();
$sql_version_ext = explode("-",$sql_version_row['version']);
$sql_version_ext1 = $sql_version_ext[0];
$sql_version_ext2 = $sql_version_ext[1];

//echo "sql_version_ext1 = ".$sql_version_ext1.'<br><br>';

if ($sql_version_ext1 < '5.7') {
    if(defined('G5_STRING_ENCRYPT_FUNCTION') && G5_STRING_ENCRYPT_FUNCTION === 'create_hash') {
        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);
        }
    } else {
        function sql_old_password($value)
        {
            $row = sql_fetch(" select old_password('{$value}') as pass ");
            return $row['pass'];
        }
    }
// mysql 5.7 이상, mariaDB 10.2 이상
} else {
    function sql_old_password($value) {
        // mysql 8.0-log ( mariaDB 10.3-MariaDB-log 미만 )
        if (($sql_version_ext2 == 'MariaDB' && $sql_version_ext1 < '10.4') || ($sql_version_ext2 == 'log' && $sql_version_ext1 < '8'))
        //if (sql_get_client_info2() < '8') 
        {
            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);
        } 
        // mysql 8.0 이상 ( mariaDB 10.4 이상 )
        else 
        {
            if ($value == '') {
                return '';
            }

            // Salt 길이 설정
            $salt_length = 32;

            // Salt 생성
            $salt = random_bytes($salt_length);

            // SHA256 해시 생성
            $sha256_hash = hash('sha256', $value, true);

            // Salt와 SHA256 해시 결합
            $salted_hash = $salt . $sha256_hash;

            // 최종 해시 생성 (SHA256으로 한 번 더 해싱)
            $final_hash = '*' . strtoupper(hash('sha256', $salted_hash));

            return $final_hash;
        }
    }
}
// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --



2-1. 그누보드5.2 / bbs / login_check.php
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
    alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- Start --
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);
}
// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --



2-2. 그누보드5.3 / bbs / login_check.php
if (!$is_social_password_check && (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) ) {
    alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- Start --
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);
}
// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --



2-3. 그누보드5.4 ~ 5.5.8.2.4 / bbs / login_check.php
if (!$is_social_password_check && (! (isset($mb['mb_id']) && $mb['mb_id']) || !login_password_check($mb, $mb_password, $mb['mb_password'])) ) {

    run_event('password_is_wrong', 'login', $mb);

    alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}

위에 내용을 추가합니다 ( 주의: 변경이 아닌 추가 입니다 )

// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
// mb_password2 필드 생성
$field_query = "SHOW COLUMNS FROM `{$g5['member_table']}` WHERE `Field` = 'mb_password2';";
$field_row = sql_fetch( $field_query );
if(!$field_row['Field']) {
    sql_query(" ALTER TABLE `{$g5['member_table']}` ADD `mb_password2` varchar(255) NOT NULL DEFAULT '' AFTER `mb_password` ", true);
}
if (sql_old_password($mb_password) == $mb['mb_password']) {
    $sql = " update `{$g5['member_table']}` set mb_password='".get_encrypt_string($mb_password)."', mb_password2='".sql_password($mb_password)."' where mb_id='{$mb_id}' ";
    sql_query($sql);
}
// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --


2-4. 그누보드5.5.8.2.5 ~ / bbs / login_check.php
if (!$is_need_not_password && (! (isset($mb['mb_id']) && $mb['mb_id']) || !login_password_check($mb, $mb_password, $mb['mb_password'])) ) {

    run_event('password_is_wrong', 'login', $mb);

    alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}

위에 내용을 추가합니다 ( 주의: 변경이 아닌 추가 입니다 )

// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
// mb_password2 필드 생성
$field_query = "SHOW COLUMNS FROM `{$g5['member_table']}` WHERE `Field` = 'mb_password2';";
$field_row = sql_fetch( $field_query );
if(!$field_row['Field']) {
    sql_query(" ALTER TABLE `{$g5['member_table']}` ADD `mb_password2` varchar(255) NOT NULL DEFAULT '' AFTER `mb_password` ", true);
}
if (sql_old_password($mb_password) == $mb['mb_password']) {
    $sql = " update `{$g5['member_table']}` set mb_password='".get_encrypt_string($mb_password)."', mb_password2='".sql_password($mb_password)."' where mb_id='{$mb_id}' ";
    sql_query($sql);
}
// 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --


3-1. 그누보드5.2 / bbs / password_check.php  9줄
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된  16byte 패스워드을 허용하면서 41byte 로 변경 저장하기

    if (sql_password($wr_password) != $wr[wr_password])
        alert("패스워드가 틀립니다.");

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

    // 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- Start --
    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);
    }
    // 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --



3-2. 그누보드5.3 / bbs / password_check.php  9줄
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된  16byte 패스워드을 허용하면서 41byte 로 변경 저장하기

    if (!check_password($wr_password, $wr['wr_password']))
        alert('비밀번호가 틀립니다.');

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

    // 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- Start --
    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);
    }
    // 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --



3-3. 그누보드5.4 ~ / bbs / password_check.php  37줄
    if (!check_password($wr_password, $wr['wr_password'])) {
        run_event('password_is_wrong', 'bbs', $wr, $qstr);
        alert('비밀번호가 틀립니다.');
    }

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

    // 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- Start --
    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);
    }
    // 옛날 패스워드를 새로운 패스워드로 바꿉니다 -- End --



Ⅱ. 그누보드 4

1. 그누보드4 / lib / common.lib.php  1180줄

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'];
}

위에 내용 추가

function sql_old_password($value)
{
    $row = sql_fetch(" select old_password('{$value}') as pass ");
    return $row['pass'];
}



2. 그누보드4 / bbs / login_check.php  25줄
if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
    alert("가입된 회원이 아니거나 패스워드가 틀립니다.\\n\\n패스워드는 대소문자를 구분합니다.");
}

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

// 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
if (sql_old_password($mb_password) == $mb['mb_password']) {
    sql_query(" update `{$g4['member_table']}` set mb_password='". sql_password($mb_password) ."' where mb_id='{$mb_id}' ");
}



3. 그누보드4 / bbs / register_form.php 의 73번째 줄을   <<== 요거는 안해도 되어요...

// 원본
    if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]))
        alert("패스워드가 틀립니다.");
// 수정
if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]) && !($member[mb_password] == sql_old_password($_POST[mb_password]) && $_POST[mb_password]))
        alert("패스워드가 틀립니다.");


옛날 사용자가 mysql 4.0.x 패스워드방식(16 bytes)을 사용하여 로그인하면 mysql 4.1.x 버젼의 패스워드(41 bytes)를 멤버테이블의 mb_password 에 저장하게 됩니다.
 
로그인할때에만 현재의 패스워드 방식을 확인하고 새로운 패스워드 포맷으로 DB 에 업데이트 하므로 /bbs/register_form.php, /bbs/member_leave.php 를 수정할 필요가 없습니다.
모든 회원이 한번이라도 로그인하게 되면 패스워드가 모두 새로운 패스워드 포맷으로 저장되게 되므로 그누보드가 버젼업될때마다 해당코드를 수정하지 않아도 됩니다.




4. 그누보드4 / bbs / password_check.php  9~10 줄
비회원 게시글을 작성한 경우, 글을 작성할때 비밀번호를 넣게 되죠, 이미 저장된  16byte 패스워드을 허용하면서 41byte 로 변경 저장하기

    if (sql_password($wr_password) != $wr[wr_password])
        alert("패스워드가 틀립니다.");

위에 내용 추가 ( 주의: 변경이 아닌 추가 입니다 )

    // 옛날 패스워드를 새로운 패스워드로 바꿉니다. 해피정닷컴
    if (sql_old_password($wr_password) == $wr['wr_password']) {
      sql_query("update `{$g4['write_prefix']}{$bo_table}` set wr_password='". sql_password($wr_password) ."' where wr_id='{$wr_id}' ");
    }



참고자료
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=1212
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=21757
https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=81926



MySQL 4.1, 5.x 이후에 생성된 회원password ( 41byte )를 MySQL 4.0.x 이하 ( 16byte )로 변경하는 방법
https://www.happyjung.com/lecture/1689

댓글목록

등록된 댓글이 없습니다.


Total 459건 22 페이지
  • RSS
기술자료 목록
39
그누보드   16411  2007-09-26 14:45 ~ 2017-01-06 00:00  
38
그누보드   10258  2007-09-21 19:02  
37
그누보드   11831  2007-09-19 12:20  
36
그누보드   10180  2007-09-18 19:20  
35
그누보드   9561  2007-09-14 08:27  
열람
그누보드   33145  2007-09-14 06:02 ~ 2024-03-29 10:06  
33
그누보드   13297  2007-08-13 08:02  
32
그누보드   14959  2007-08-11 12:15 ~ 2023-06-14 16:40  
31
그누보드   17926  2007-07-26 19:18 ~ 2020-01-14 22:55  
30
그누보드   25360  2007-07-25 20:23 ~ 2020-10-07 18:47  
29
그누보드   13322  2007-07-25 09:37  
28
그누보드   13167  2007-07-25 09:05  
27
그누보드   14775  2007-07-14 15:45 ~ 2020-10-05 07:01  
26
그누보드   14347  2007-07-14 15:44  
25
그누보드   9984  2007-07-14 15:40  
24
그누보드   17496  2007-07-05 06:47  
23
그누보드   14434  2007-06-29 09:00  
22
그누보드   12360  2007-06-26 09:37  
21
그누보드   11435  2007-06-21 06:37  
20
그누보드   21385  2007-06-12 17:37  

검색

해피정닷컴 정보

회사소개 회사연혁 협력사 오시는길 서비스 이용약관 개인정보 처리방침

회사명: 해피정닷컴   대표: 정창용   전화: 070-7600-3500   팩스: 042-670-8272
주소: (34368) 대전시 대덕구 대화로 160 대전산업용재유통단지 1동 222호
개인정보보호책임자: 정창용   사업자번호: 119-05-36414
통신판매업신고: 제2024-대전대덕-0405호 [사업자등록확인]  
Copyright 2001~2024 해피정닷컴. All Rights Reserved.