1

我正在使用moodle系统,但事实证明它使用md5 salt hashing。我找到了一些,所以也许你可以向我解释一下,因为我只有基本的 php 知识。

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;

}

输入简单文本后会变成散列,这很难改变吗?

4

1 回答 1

1

这是一个密码验证,其中包含一些旧密码。

它允许使用 5 种形式的密码:

  • md5(密码)
  • md5(添加斜杠(密码))
  • md5(密码+通用盐)
  • md5(addslashed) + 通用盐)
  • md5(密码 + saltX)

首先,什么是md5?md5 是“消息摘要 5”。长话短说,它是一个将字符串转换为 32 个字符的字符串调用 a 的函数hash。的主要属性hash是很难(如计算上的困难)取回原始字符串。存储密码的理想选择,对吧?:)

但是只有密码是不够的。想象一下您的密码是“dragon”(顺便说一句,密码非常糟糕)。如果你碰巧知道 md5 中的“dragon”是“8621ffdbc5698829397d97767ac13db3”,你只需查看hash. 因此,您添加了所谓的“盐”。这只是在散列之前添加到密码中的另一个词。

如果您的盐是“notsob1gs3cret”,则密码本质上是“dragonnotsob1gs3cret”,结果为:“c47948e6b966357f1b9a3732c4ee7c72”,它看起来不像“8621ffdbc5698829397d97767ac13db3”。这是哈希的另一个属性,相似的输入应该产生完全不相似的输出,足以与任何随机词几乎一样相似。

如果您的攻击者从未见过盐“notsob1gs3cret”,他就不会那么容易猜出原始密码。

所以关于你的代码。忽略addlashes,这可能来自一些遗留错误。看起来有人后来试图添加一个加盐机制,但仍然希望所有旧密码都能正常工作,但看起来有点笨拙。理想情况下,您只有一种有效的密码机制并升级您较弱的安全性。

有 20 种不同的盐,我想这是一个不错的主意 .. 但代码似乎不知道使用了哪一种 .. 所以它会尝试所有的盐吗?这很奇怪,可能不安全。

要散列一些文本,只需执行以下操作:

$text = "a bit of text";
var_dump(md5($text));
于 2012-04-13T19:28:08.800 回答