爲了從加密中獲得相同的結果,必須在比較散列值之前使用相同的機制進行加密。
如果您已經創建了密碼功能的原始密碼哈希值,哈希看起來像這樣(爲PASSWORD函數的當前版本
*196BDEDE2AE4F84CA44C47D54D78478C7E2BD7B7
或類似這樣的,如果與OLD_PASSWORD函數創建(前MySQL 4.1中...)
29bad1457ee5e49e
直的方法來處理這個是讓你的認證查詢這個樣子
select count(*) as authfield from your_auth_table
where username = 'typed-in-username'
and
(
password = password('typed-in-password')
or password = old_password('typed-in-password')
)
如果用戶名和密碼匹配,這將產生authfield = 1
如果你想自己做加密在PHP中,記者到MySQL密碼algorythm是這樣的:
$passwordnew = '*'. strtoupper(sha1(hextostr(sha1('pass'))));
function hextostr($hex)
{
$str='';
for ($i=0; $i < strlen($hex)-1; $i+=2)
{
$str .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $str;
}
對於您可以使用的old_password功能
$passwordold = old_password('pass');
function old_password($password) {
if ($password == '')
return '';
$nr = 1345345333;
$add = 7;
$nr2 = 0x12345671;
foreach(str_split($password) as $c) {
if ($c == ' ' or $c == "\t")
continue;
$tmp = ord($c);
$nr ^= ((($nr & 63) + $add) * $tmp) + ($nr << 8);
$nr2 += ($nr2 << 8)^$nr;
$add += $tmp;
}
if ($nr2 > PHP_INT_MAX)
$nr2 += PHP_INT_MAX + 1;
return sprintf("%x%x", $nr, $nr2);
}