2012-04-13 161 views
1

我正在使用moodle系统,但事实证明它使用md5盐哈希。我发现了一些来,所以也许你可以解释它给我,因为我只有PHP的基本知识。php代码md5哈希解释

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

你的问题就没有意义了。完全不清楚你想要做什么。 – ceejayoz 2012-04-13 19:19:01

+0

我正在创建一个java应用程序,它将连接到数据库并从中获取数据,但存在问题。使用网页注册的帐户密码已变更。上面的代码应该是它如何改变的方式。但我不明白,我想如果有人可以给我解释 – LTnewbie 2012-04-13 19:24:11

+1

使用Moodle的网络服务API。不要直接使用数据库。 Moodle已经破碎了,因为它不会让事情变得更糟。 – Brad 2012-04-13 19:31:09

回答

1

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

有5所形成密码它将允许:

  • MD5(密码)
  • MD5(和addslashes(密码))
  • MD5(密码+通用盐)
  • MD5(addslashed )+通用盐)
  • MD5(密码+ saltX)

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

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

如果你的盐是“notsob1gs3cret”密码本质上是“dragonnotsob1gs3cret”这会导致:“c47948e6b966357f1b9a3732c4ee7c72”,这看起来并不像什么“8621ffdbc5698829397d97767ac13db3”。这是散列的另一个属性,类似的输入应该产生完全不相似的输出,足以和任何随机词几乎相似。

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

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

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

哈希一些文字只是做:

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

如何知道使用什么盐字? – LTnewbie 2012-04-13 19:33:17

+0

这是他不知道的一点,他只是尝试所有这些。当然,一旦你找到了一场比赛,你就会知道使用了哪一场,但那也需要一个有效的密码。 – Halcyon 2012-04-13 19:34:08

+0

非常有用,谢谢。 – Norse 2012-04-13 19:48:04