mysql 버전에 따른 패스워드 관련하여.
본문
mysql 서버 버전: 5.0.67-log
현재 회원테이블에 password() 함수의 결과가 16bytes와 41bytes 혼영되어 있습니다.
7a5efc50383f56fb
*89C6B530AA78695E257E55D63C00A6EC9AD3E977
이렇게 저장이 되어 있습니다.
이것을 모두 로그인을 하게 되면 5.0 형식으로 변경을 하려고 하는데..
if (!$mb['mb_id'] || !check_password($mb_password, $mb['mb_password'])) {
alert('가입된 회원아이디가 아니거나 비밀번호가 틀립니다.\\n비밀번호는 대소문자를 구분합니다.');
}
이것을
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);
}
이렇게 변경을 했습니다.
이렇게 했더니 16bytes는 로그인이 되지 않더라고요.
그래서 lib/common.lib.php 1536번줄을
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_password($value)
{
// mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
// mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
$p41=sha1($value,true);
$p41=sha1($p41);
return "*".strtoupper($p41);
}
이렇게 하니 16bytes과 41bytes 방식 모두 로그인은 되는데 패스워드가 update가 되지 않고 그대로 유지가 되더라고요.
어떻게 해야 update가 될까요?
그리고
function sql_password($value)
{
// mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
// mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
$p41=sha1($value,true);
$p41=sha1($p41);
return "*".strtoupper($p41);
}
위 코드는 어떤 역활을 하나요?
답변 2
변환은 불가능합니다!
암호화된것끼리를 비교가 가능하겠지만 decode는 안되는걸루 알고있습니다.
내용을 보니까 뭐랄까 일관성이 없다고 해야 맞을꺼 같습니다.
이런경우는 드문케이스라 생각되는데요..즉 16비트랑 32비트형식의 password가 들어가있다는 이야기잖아요?
우선 어느 기준으로 password를 사용할것인가를 결정하셔야할꺼 같습니다.
그리고 가지고오는것이 문제인데요..분명 16비트랑 32비트랑 길이 차익 확연하게 차이 납니다.
따라서 우선 먼저 어느정도 읽어온다음..예를들어 20바이트 이상인것을 32비트로 기준을 잡을수 있습니다.
우선 먼저 가지고 다음 현재 저장되어있는 비번이 SELECT해서 16인지.32비트지 인지 구분을 하여 if조건문으로 비번이 16비트인경우 old_password 쿼리 함수를 사용하시고 32비트인경우 password함수를 사용하셔서 조건별로 가지고 오시면 어떨까 생각합니다.
그리고 update는 기준을 잡아서 32비트로만 저장을 하시는게 향후 유지하시는데 더 좋을거라 생각됩니다.
함께 생각을 해보려니 조금 머리가 아프네요~
암튼 부족하나마 도움이 되셨으면 하는 마음에 정리를 해봤습니다.