【问题标题】:Is my authentication encryption any good?我的身份验证加密有用吗?
【发布时间】:2010-11-04 15:23:06
【问题描述】:

所以我已经阅读了很多关于 PHP 加密的内容。以至于我不确定究竟什么是安全存储登录信息的真正好方法。

但是,我想出了以下功能:

function loginHash($username, $password){
    $salt = str_split($password,(strlen($password)/2)+1);
    $hash = hash('whirlpool', $username.$salt[0].'centerSalt'.$salt[1]);
    return $hash;
}

我做对了吗?它用于验证与用户名结合的密码,以及将生成的哈希与存储在数据库中的哈希进行比较以验证登录的能力。

【问题讨论】:

    标签: php authentication encryption hash salt


    【解决方案1】:

    我的建议是永远、永远、永远不要编写自己的加密和哈希函数。高手也经常做错,千万不要自己去尝试。

    我听说phpass (Openwall) 是一个不错的哈希框架,我建议你使用它。

    他们在哈希中使用盐,并且有相当多的参数来调整哈希。

    【讨论】:

    • 谢谢。不过希望该框架有一些文档。
    • 不幸的是他们仍然使用 MD5。
    • 哦,那我还是别用比较好。
    • Md5 坏了,但你仍然需要 300 个游戏机才能破解它。所以对于简单的 web 应用程序来说还是足够的。此外,您可以将框架的代码更改为使用 sha1/2 而不是 md5
    • 它只使用 MD5 作为最后的后备。如果可用,它将使用 Blowfish。即使使用MD5,它仍然会运行多轮,因此它比直接MD5更难破解。
    【解决方案2】:

    我认为上面的代码检查了这两个框。

    • 避免彩虹表攻击(通过 Salts)
    • 安全登录

    【讨论】:

      【解决方案3】:

      你实际上并没有使用盐。

      Salt 是一个 随机 生成的字符串,包含在哈希函数的输入中。因此,每次都会有所不同。

      这个想法是,当用户存储密码时,您会生成一个 salt,并且这个 salt 包含在您的数据存储中。身份验证时,您检索盐和存储的散列,在给定密码前加上存储的盐,然后将两者散列在一起。然后将结果与存储的哈希进行比较。

      【讨论】:

      • 有趣。但是,如果盐始终不同,您如何将哈希与数据库中的哈希进行比较?会不会一直不一样?
      • 是的,这也是您将其存储在数据库中的原因。这是确保散列不可预测的最佳机制,基于用户名/密码组合。
      • 那么我错过了一些东西,因为我不太确定字符串 A 与字符串 B 相比是否好,即使两个字符串都不同?希望我有任何意义。
      • 啊,对不起,您的意思是您还将盐存储在数据库中。谢谢。
      • 您将盐保存在与散列 $password.$salt 不同的位置。这提供了对彩虹表的考虑阻力。
      【解决方案4】:

      加密!=散列。它们都被普遍认为属于密码学的范畴,但是当某些东西可以被加密时,它就可以被解密,而散列则不是这种情况。散列就是散列,仅此而已。

      盐确实构造不正确。它应该是使用 fopen() 调用从 /dev/urandom 读取的 x 字节。例如,16 字节的盐是我个人使用的。这可以有效地防止彩虹表攻击。

      为了使事情更安全,也请使用密钥。例如:

      $hashedPassword = hash_hmac('whirlpool',$password.$salt,$key);
      

      $key 只是随机数据。例如,您可以在文档根目录上方的隐藏文件夹中生成一个名为“key.bin”的 64 kB 文件,并在哈希处理之前使用 file_get_contents()。

      为什么要使用密钥?如果您将哈希和盐存储在数据库中,并将密钥存储在文件系统中,那么这可以防止任何人在拿到您存储的哈希和盐时破解您的哈希。因此,攻击者需要同时破解数据库和文件系统来破解您的哈希值,但请注意,如果任何人已经破解了您的整个应用程序,那么破解您的哈希值将毫无意义,这意味着您的哈希方案是好的。

      【讨论】:

      • 从 PHP 7 开始,您可以使用 openssl_random_pseudo_bytes,而不是从 /dev/urandom 读取
      【解决方案5】:

      使用盐解决了两个问题:

      1. 彩虹表:彩虹表只是预先计算的哈希值,与源值一起存储。通过比较哈希值,您可以获得未经哈希处理的值(密码)。通过添加盐,您会获得另一层复杂性 - 攻击者必须知道盐才能生成自定义哈希表。

      2. 散列值的差异:没有盐,相同的 2 个密码生成相同的 2 个散列。现在很容易看出两个用户是否使用相同的密码(这里的弱点与彩虹表大致相同,但仍然如此)。这可能不算多,但仍然是一个值得关注的问题。

      此外,您不应使用快速算法进行密码散列。 md5 快,sha 快。越慢越好。

      matsano chargen 博客是一个很好的(有趣的)资源,提供有关安全性的提示和指针。

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 2014-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        相关资源
        最近更新 更多