我目前正在开发一个网站,客户端使用“密码”功能将密码存储在 MySQL 数据库中。
新数据库将使用 MD5 和 Salt 的组合来存储加密密码。
因此,我使用加密密码将现有用户复制到我们的数据库中,但是当运行密码函数来检查登录时,它总是返回不正确的密码。当我检查密码函数对正确密码的结果时,它会产生与存储的结果不同的结果。
我需要做一些额外的工作才能使加密匹配并产生相同的结果吗?我必须直接从客户网站访问密码吗? (因为我已将用户表复制到我们的本地数据库)
最佳答案
为了从加密中获得相同的结果,您必须在比较哈希值之前使用相同的机制进行加密。
如果您使用密码函数创建了原始密码哈希值,则哈希值将如下所示(对于当前版本的 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);
}
关于mysql - PHPMyAdmin 数据库之间的密码加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23522461/