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으로 설정된 것도 있을테니 그쪽으로 옮겨주면 되겠네요..
어떻게 해결하셨는지 답변을 달아주시면 다음에 다른분에게도 도움이 되실거라 생각되네요 ^^