php代码md5哈希解释

时间:2012-04-13 19:15:37

标签: php

我正在使用moodle系统,但事实证明它使用了md5 salt散列。我找到了一些来,所以也许你可以解释一下,因为我只有基本的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;

}

在输入简单文本之后,它会变得很难改变吗?

1 个答案:

答案 0 :(得分:1)

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

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

  • MD5(密码)
  • MD5(和addslashes(密码))
  • md5(密码+通用盐)
  • md5(已添加)+通用盐)
  • md5(密码+ saltX)

首先,md5是什么? md5是“消息摘要5”。长话短说,它是一个将字符串转换为32个字符串的函数,调用hashhash的主要特性是,恢复原始字符串很难(在计算上很难)。非常适合存储密码,对吧? :)

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

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

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

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

有20种不同的盐,这是我认为的一个公平的想法..但代码似乎不知道使用了哪一种..所以它尝试了所有这些?这很奇怪,可能不安全。

要散列一些文字,请执行以下操作:

$text = "a bit of text";
var_dump(md5($text));