MySQL 버전이 4.1대로 넘어오면서 MySQL 함수인 PASSWORD()의 암호화 방법이 달라졌다고 한다. 이전의 PASSWORD() 함수는 16자리 결과물(해시값)을 내놓는 데 반해 새로운 PASSWORD() 함수는 41자리 결과물을 내놓는다.

사용자 인증시 PASSWORD() 함수를 사용하고 있었다면, MySQL 버전이 달라졌을 때 난감해진다. 이 때 가장 간단한 대처법은, PHP인 경우 코드에 다음 값을 추가해 주는 것이다.

//mysql 연결을 한 뒤
@mysql_query( 'set old_passwords = 1 ');

이렇게 하면 문제가 해결된다.

다른 방법 1. my.cnfold_password = 1 추가

다른 방법은 내가 실제로 해 보지는 않아서 사소한 정확성이 떨어질 수 있다.

/etc/my.cnf 파일을 찾아서 old_password = 1 이라는 옵션을 추가해 주면 해결된다고 한다. (my.cnf 파일의 위치는 사용하고 있는 운영체제에 따라 다르다. 그리고 운영체제가 같아서 MySQL을 어떻게 설치해서 사용하고 있냐에 따라 다르다. /etc/my.cnf 는 리눅스 기본 설치 기준인 듯하다.)

다른 방법 2. OLD_PASSWORD() 함수를 사용

만약 소스 코드를 확실하게 관리할 수 있고, DB 때문에만 문제가 생긴 거라면, MySQL 쿼리 부분의 PASSWORD() 함수를 OLD_PASSWORD() 함수로 변경해 준다. 그러면 깔끔하게 해결될 거다.

다른 방법 3. PHP로 대체

PHP 함수를 뒤져 보니 old_password()를 구현해 놓은 걸 찾을 수 있었다. 이걸 사용할 수도 있다.

function old_password($password) {
	$nr=0x50305735;
	$nr2=0x12345671;
	$add=7;
	$charArr = preg_split("//", $password);
	foreach ($charArr as $char) {
		if (($char == '') || ($char == ' ') || ($char == '\t')) continue;
		$charVal = ord($char);
		$nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
		$nr2 += ($nr2 << 8) ^ $nr;
		$add += $charVal;
	}
	return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff));
}