mysql 버전에 따른 패스워드 더디어 원인을 알았습니다.

mysql 버전에 따른 패스워드 더디어 원인을 알았습니다.

QA

mysql 버전에 따른 패스워드 더디어 원인을 알았습니다.

본문

기존서버에 mysql 5.0.67 이 설치되어있습니다.

 

신서버에도 mysql 5.0.67 이 설치되어있는데, 사용자 및 관리자의 패스워드 오류가 발생합니다.

 

 

두 서버에서 update admin set adpw=password('1234'); 로 처리한 결과 아래와 같이 각기 다르게 출력됩니다.

 

 

현재의 mysql 시스템입니다.

 

서버 버전: 5.0.67-log

Protocol version: 10

서버: Localhost via UNIX socket

사용자: joeuns@localhost

MySQL 문자셋: UTF-8 Unicode (utf8)

MySQL connection collation: utf8_general_ci

 

위 시스템에서 그누보드를 설치하면 41바이트 형식인 *A4B6157319038724E3560894F7F932C8886EBFCF 으로 저장이 될줄 알고 있었답니다.

그런데 그누보드를 설치하고 테이블을 보니 관리자 패스워드필드에 446a12100c856ce9 이렇게 저장이 되지 않겠습니까? ㅠㅠ

이런 사실을 모르고 오로지 16bytes => 41bytes로 변경했어니 그누보드 원본을 사용하니 로그인이 안될수 밖에 ㅠㅠ

 

여기서 질문을 드립니다.

5.X 버젼은 대부분 41bytes 저장이 되는것이 기본인데 왜 4.0 버전대로 저장이 될까요?

웹호스팅에 연락해서 41bytes로 변경요구가 가능한지요.

지금까지 모든 회원을 41bytes로 변환하여 저장을 했는데 ㅠㅠ

 

아니면 

function sql_password2($value)

{

    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes

    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes

    $row = sql_fetch(" select old_password('$value') as pass ");

 

    return $row['pass'];

}

 

// 비밀번호 비교

function check_old_password($pass, $hash)

{

$password = sql_password2($pass);

    return ($password === $hash);

}

 

if (!$mb['mb_id'] || (!check_password($mb_password, $mb['mb_password']) && !check_old_password($mb_password, $mb['mb_password']))) {

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

}

 

if(check_old_password($mb_password, $mb['mb_password'])) {

$sql= " update {$g5['member_table']} set mb_password = password('$mb_password') where mb_id = '{$mb['mb_id']}' ";

    sql_query($sql);

}

 

 

이렇게 되어 있는것을 

 

function sql_password2($value)

{

    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes

    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes

    $row = sql_fetch(" select old_password('$value') as pass ");

 

    return $row['pass'];

}

 

// 비밀번호 비교

function check_old_password($pass, $hash)

{

$password = sql_password2($pass);

    return ($password === $hash);

}

 

if (!$mb['mb_id'] || (!check_old_password($mb_password, $mb['mb_password']) && !check_password($mb_password, $mb['mb_password']))) {

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

}

 

if(check_password($mb_password, $mb['mb_password'])) {

$sql= " update {$g5['member_table']} set mb_password = password('$mb_password') where mb_id = '{$mb['mb_id']}' ";

    sql_query($sql);

}

 

이렇게 변경해야 현재의 시스템에 맞께 변경이 되겠지요?

즉, check_password 와 check_old_password 위치를 변경하면 16bytes 형식으로 저장이 되것지요?

 

 

이 질문에 댓글 쓰기 :

답변 2

mysql.cnf << mysql 설정에서 old_password=1 로 설정해놓으면 4.0이상 버전에서도 16바이트로 저장이 됩니다. 아마 이전한곳 설정이 저렇게 되어있는것 같은데요. 웹호스팅이면 저 설정을 바꾸면 같은 mysql을 이용하는 다른 사용자까지 영향을 받기때문에 변경하기는 어려울것 같습니다. 질문자님 맞추려고 저 설정을 바꾸면 같은 mysql을 사용하는 다른 사용자들 사이트에서 로그인이 안될테니까요.

 

old_password=1 로 설정이 되어있다면 old_password 와 password 가 같은 기능을 할테니.. 위에서 이중 체크하는건 의미 없다고 보여집니다.

 

만약 41바이트로 암호화 된 데이타를 이전한거라면 로그인 자체를 할수가 없을거예요.

 

아.. 웹호스팅 회사에서 DB서버를 여러개 운영하고 있다면 그중에 old_password=0으로 설정된 것도 있을테니 그쪽으로 옮겨주면 되겠네요..

common.lib.php

function sql_password($value)
{
    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
$p41=sha1($value,true);
$p41=sha1($p41);
return "*".strtoupper($p41);

}

이렇게 할 경우 41바이트 16바이트 모두 로그인이 됩니다.

웹호스팅 mysql 설정이 16비트 암호화로 되어 있다면
common.lib.php는 위 내용으로 수정하고

bbs/login_check.php 파일에

16 => 41로 변경 수정을 하고
41 => 16로 변경 수정을 하여
모든 회원들이 한번만 로그인을 하게 될 경우 시스템 설정에 맞는 암호화로 저장이 되었다면

그누보드 원본을 수정하지 않아도 모두 접속이 되는 방향으로 해야겟네요.

답변을 작성하시기 전에 로그인 해주세요.
전체 126,563 | RSS
QA 내용 검색

회원로그인

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