为了从加密中得到相同的结果,你必须在比较哈希之前使用相同的机制进行加密。
如果您使用密码函数创建了原始密码哈希,哈希将如下所示(对于当前版本的 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 PASSWORD 算法是这样的:
$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);
}