mysql의 password함수 해쉬 알고리즘이 4.1버젼 이상부터 업그레이드 되었습니다. 이 부분을 이전에 제로보드에 리포팅 하려고 하다가, 왠지 중간에 귀찮아져서 하지 않았는데, 사실 그다지 중요한 부분도 아닌데다가 이전버젼의 데이터를 4.1로 고스란히 옮겨오는 일만 아니면 따로 신경써야 할 필요도 없습니다.
문제는 기존 함수가 16바이트의 해쉬를 만들어내는 반면에 새로운 함수는 41바이트로 길이가 늘었다는 것입니다. 이 경우 다음과 같은 상황에서 문제가 발생합니다.
[4.1이전 버젼에서 4.1로 데이터 이전시]
1. 기본적으로 해쉬 알고리즘 자체가 바뀌었으므로 같은 문자열이라도 output이 다르다.
2. 이전 password함수로 작성된 해쉬를 삭제하고 새로운 password함수로 재작성한다 하더라도 칼럼의 길이가 41바이트 이하라면, "select * from where password = password(‘mypass’);"와 같은 쿼리가 원하는 결과를 출력하지 않는다.
[4.1버젼 처음 사용시]
1. 이전 버젼 생각만 하고 16바이트로 password함수를 사용할 칼럼의 크기를 지정해버리면 위의 2번과 같은 문제로 원하는 결과를 얻을 수 없다.
물론 걔네들이 무턱대로 password함수를 업그레이드 한건 아닙니다. 위 경우 기존 password함수와 같은 결과를 얻을 수 있는 새로운 함수가 생겼습니다. old_password함수는 4.1이전 버젼의 password함수와 같은 해쉬 결과를 출력합니다.
여기서 유의할 점은 4.1로 데이터 이전시에 기존 password함수 등으로 데이터를 저장했다면 old_password를 사용할 행은 어디까지며, 새롭게 바뀐 password함수를 사용할 행은 어디부터인지를 살피는 것입니다.
그게 귀찮다면, 사용자 요청에 의해서 입력받은 password값을 두번 넣어보면 됩니다. 즉 password함수로 찾아보고, 결과가 없다면 old_password함수로 한번 더 찾아보는 겁니다. (물론 데이터를 이전하면서 password함수를 사용할 칼럼을 반드시 41바이트 이상의 길이로 변경해야 합니다.)
더 자세한 내용은 다음 링크에 있습니다.
http://dev.mysql.com/doc/mysql/en/password-hashing.html