我正在使用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;
}
在输入简单文本之后,它会变得很难改变吗?
答案 0 :(得分:1)
这是一个密码验证,其中包含一些旧密码。
它允许使用5种密码形式:
首先,md5是什么? md5是“消息摘要5”。长话短说,它是一个将字符串转换为32个字符串的函数,调用hash
。 hash
的主要特性是,恢复原始字符串很难(在计算上很难)。非常适合存储密码,对吧? :)
但仅靠密码是不够的。想象一下,你的密码是“龙”(非常糟糕的密码顺便说一句)。如果您碰巧知道md5中的“dragon”是“8621ffdbc5698829397d97767ac13db3”,只需查看hash
即可知道密码。所以你添加了所谓的'盐'。这是在散列之前添加到密码的另一个词。
如果您的盐是“notsob1gs3cret”,则密码基本上是“dragonnotsob1gs3cret”,其结果是:“c47948e6b966357f1b9a3732c4ee7c72”,它看起来不像“8621ffdbc5698829397d97767ac13db3”。这是哈希的另一个属性,类似的输入应该产生完全不相似的输出,足以与任何随机词几乎相似。
如果你的攻击者从未见过盐“notsob1gs3cret”,他就不会那么容易猜到原来的密码。
关于你的代码。忽略addslashes,这可能来自一些遗留的bug。看起来有人试图稍后添加一个salting机制,仍然希望所有旧密码都可以工作,但它看起来有点笨拙。理想情况下,您只有一个有效的密码机制并升级您较弱的安全性。
有20种不同的盐,这是我认为的一个公平的想法..但代码似乎不知道使用了哪一种..所以它尝试了所有这些?这很奇怪,可能不安全。
要散列一些文字,请执行以下操作:
$text = "a bit of text";
var_dump(md5($text));