1

现在我正在尝试检查 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));

在定义盐字的配置文件中,我使用了与上面相同的内容。

已编辑:是否可以从此代码中获取哈希算法?

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; 

编辑 我试过这个代码:

$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。但是还是找不到正确的。

4

1 回答 1

1

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

  1. 密码/名称/盐不正确(输入错误)
  2. 哈希不正确(生成方式不同或使用不同的盐)
  3. 给定用户的哈希值不正确(例如,不匹配、无记录等)

现在,完成散列的方式看起来......错误。盐的想法是阻止彩虹表攻击,这使得攻击者不得不依靠蛮力来“破解”给定的密码。

无论如何,对于每个保存的新密码哈希,生成一个新的随机盐值(例如,128 位或更多)。然后使用这种独一无二的随机数在密码被散列之前对密码进行加盐。然后将哈希盐保存在一起(它们通常组合成一个值,但如果它们位于不同的列中也可以)。

因此,要确保密码有效:

  1. 找到代表用户的行,提取hashsalt
  2. 使用盐从密码生成哈希;如果哈希/盐被保存为组合值,则根据需要首先将其分开
  3. 验证生成的哈希和存储的哈希

也就是说,查询可能应该搜索username = '$username' AND password = '$new'"password真正应该调用的地方hash或类似的地方),因为盐需要可用于再次生成正确的散列。在上面的代码片段中,它使用 20 种不同的预设盐做一些猴子业务。这不是正确的方法,并且要求在哈希生成中使用每个潜在的盐,以便可以找到“正确的哈希”。(翻译成select帖子中的,这将需要多达 20 次不同的执行和/或使用in或类似的东西。)

此外,请勿将 MD5 用于密码哈希。蛮力太容易了。也不要使用 SHAx;它仍然太快,因为它也不是为此目的而设计的。使用类似的东西bcryptor scrypt。如果您确实想要“服务器盐”(这是一个很好的附加层),请使用 HMAC。这不能代替普通的盐。哦,请不要使用容易注入 SQL 的代码

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

快乐编码。

于 2012-04-14T07:23:25.300 回答