md5 salt hash在DB中找不到相同的条目

时间:2012-04-14 06:21:48

标签: php mysql

目前我正在尝试检查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。但仍然找不到正确的。

1 个答案:

答案 0 :(得分:1)

正如其他人在评论中所说:

  1. 密码/名称/盐不正确(输入错误)
  2. 哈希值不正确(生成不同或使用不同的盐)
  3. 给定用户的哈希值不正确(例如,它不匹配,没有记录等)
  4. 现在,散列完成的方式看起来......错了。盐的想法是停止彩虹表攻击,这使得攻击者不得不依靠蛮力“破解”给定的密码。

    无论如何,对于保存的每个新密码哈希,生成一个新的随机 salt值(比方说,如128位或更多)。然后使用这种独一无二的 nonce 在进行哈希处理之前对密码进行加密。然后将哈希哈希值保存在一起(它们通常组合成一个值,但如果它们位于不同的列中就没问题。)

    因此,要确保密码有效:

    1. 找到代表用户的行并提取哈希 salt
    2. 使用salt从密码生成哈希;如果哈希/盐被保存为组合值,则首先根据需要将其分开
    3. 验证生成的哈希和存储的哈希
    4. 也就是说,查询应该搜索username = '$username' AND password = '$new'"(其中password应该真正被称为hash或类似),因为salt 需要可用再次生成正确的哈希。在上面的代码片段中,它使用20种不同的预设盐来做一些猴子业务。这不是正确的方法,并且要求在哈希生成中使用每个潜在的盐,以便找到“正确的哈希”。 (翻译到帖子中的select,这将需要最多20次不同的执行和/或使用in或类似的东西。)

      此外,请勿使用MD5进行密码哈希。它非常容易暴力。不要使用SHAx;它仍然太快,因为它也不是为此目的而设计的。使用bcryptscrypt之类的内容。如果您确实需要“服务器盐”(这是一个良好的附加层),那么请使用HMAC。这不会取代普通的盐。哦,请不要使用易于SQL注入的代码

      我会使用现有的经过严格审查的库:)

      快乐的编码。