目前我正在尝试检查MysSql数据库中是否有相同的密码。但我失败了,我不明白为什么。
$username = 'blablabla';
$password = 'blablabla.';
$salt = 'blablabla';
$new = md5($password.md5($salt));
echo($new);
$q=mysql_query("SELECT * FROM mdl_user WHERE username = '$username' AND password = '$new'");
while($e=mysql_fetch_assoc($q))
$output[]=$e;
print(json_encode($output));
在定义盐字的配置文件中,我使用了与上面相同的内容。
EDITED: 是否有可能从此代码中获取哈希算法?
function validate_internal_user_password($user, $password) {
global $CFG;
if (!isset($CFG->passwordsaltmain)) {
$CFG->passwordsaltmain = '';
}
$validated = false;
if ($user->password === 'not cached') {
// internal password is not used at all, it can not validate
} else if ($user->password === md5($password.$CFG->passwordsaltmain)
or $user->password === md5($password)
or $user->password === md5(addslashes($password).$CFG->passwordsaltmain)
or $user->password === md5(addslashes($password))) {
// note: we are intentionally using the addslashes() here because we
// need to accept old password hashes of passwords with magic quotes
$validated = true;
} else {
for ($i=1; $i<=20; $i++) { //20 alternative salts should be enough, right?
$alt = 'passwordsaltalt'.$i;
if (!empty($CFG->$alt)) {
if ($user->password === md5($password.$CFG->$alt) or $user->password === md5(addslashes($password).$CFG->$alt)) {
$validated = true;
break;
}
}
}
}
if ($validated) {
// force update of password hash using latest main password salt and encoding if needed
update_internal_user_password($user, $password);
}
return $validated;
EDITED 我试过这段代码:
$username = 'admin';
$password = 'Vidsodis25.'+'Karolina';
$new = md5($password);
echo($new);
$q=mysql_query("SELECT * FROM mdl_user WHERE password = '$new'");
while($e=mysql_fetch_assoc($q))
$output[]=$e;
print(json_encode($output));
数据库使用相同的盐词Karolina。但仍然找不到正确的。
答案 0 :(得分:1)
正如其他人在评论中所说:
现在,散列完成的方式看起来......错了。盐的想法是停止彩虹表攻击,这使得攻击者不得不依靠蛮力“破解”给定的密码。
无论如何,对于保存的每个新密码哈希,生成一个新的随机 salt值(比方说,如128位或更多)。然后使用这种独一无二的 nonce 在进行哈希处理之前对密码进行加密。然后将哈希和哈希值保存在一起(它们通常组合成一个值,但如果它们位于不同的列中就没问题。)
因此,要确保密码有效:
也就是说,查询应该不搜索username = '$username' AND password = '$new'"
(其中password
应该真正被称为hash
或类似),因为salt 需要可用再次生成正确的哈希。在上面的代码片段中,它使用20种不同的预设盐来做一些猴子业务。这不是正确的方法,并且要求在哈希生成中使用每个潜在的盐,以便找到“正确的哈希”。 (翻译到帖子中的select
,这将需要最多20次不同的执行和/或使用in
或类似的东西。)
此外,请勿使用MD5进行密码哈希。它非常容易暴力。不要使用SHAx;它仍然太快,因为它也不是为此目的而设计的。使用bcrypt
或scrypt
之类的内容。如果您确实需要“服务器盐”(这是一个良好的附加层),那么请使用HMAC。这不会取代普通的盐。哦,请不要使用易于SQL注入的代码!
我会使用现有的经过严格审查的库:)
快乐的编码。