有没有人认为他们可以破解这种散列函数?

时间:2015-12-13 04:17:29

标签: hash passwords md5

我总是听说md5哈希是多么不安全,所以我写了这篇文章,希望它更安全......我知道其他哈希,但我的问题是:

如果我通过此函数存储了我的密码哈希,你认为任何人都可以反转或查找这些哈希值,以便对这些密码进行反混淆吗?

<?/*
  Script Written By Michael O'Neal on 12/12/2015

  How to use:
  $info = "Info to destroy"
  $salt = "Something to add to $info to spice it up"
  $level = "how many repetitions of 1000 to hash $info with salt"

  */

  function destroy($info, $salt, $level){
    for($i=0;$i!=($level*1000)+1;$i++){
      $info = md5($info.$salt);
    }
    return $info;
  }
?>

2 个答案:

答案 0 :(得分:1)

第一个问题应该是,如果有经证实的方案,你为什么要发明自己的方案?这看起来有点类似于PBKDF2,但并不完全相同。

让我们来看看一些细节:

  1. 参数$info未通过引用传递,因此如果没有return,则您的函数不会执行任何操作。
  2. $ level = 1你会做多少次迭代,1000,1001?
  3. 您如何验证密码,您如何了解用过的盐和水平,它们存放在哪里?
  4. 你如何生成一个安全的盐,它是二进制的,可能是\ 0个字符还是由PHP rand()函数生成的?
  5. 所有这些细节可能看起来都是小错误,但它表明在密码安全性方面犯错是多么容易,而一个小错误可能会破坏整个安全性。所以请考虑使用PHP函数password_hash(),它处理有关安全存储密码的所有困难部分:

    // Hash a new password for storing in the database.
    // The function automatically generates a cryptographically safe salt.
    $hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
    
    // Check if the hash of the entered login password, matches the stored hash.
    // The salt and the cost factor will be extracted from $existingHashFromDb.
    $isPasswordCorrect = password_verify($password, $existingHashFromDb);
    

答案 1 :(得分:0)

"Schneier's Law":从最无能的业余爱好者到最好的密码学家,任何人都可以创建一个他自己无法破解的算法。

迈克尔奥尼尔现在认为他可以做得更好。

领域专家对现有的哈希进行了密集的同行评审。

对于散列密码,当前的最佳做法是PBKDF2(基于密码的密钥派生函数)请参阅NIST Special Publication 800-132。它经过了很好的审查。

许多实现还提供了迭代次数的校准函数。