【问题标题】:Why not use AES for password encryption in PHP?为什么不在 PHP 中使用 AES 进行密码加密?
【发布时间】:2011-03-09 19:50:51
【问题描述】:

我在任何地方都看到人们谈论在数据库中存储密码,他们几乎总是使用 MD5。

AES 或 SHA1 有什么问题?

【问题讨论】:

  • 加密 (AES) != 哈希 (MD5, SHA1)
  • 你可以在 php.ini 中使用 sha1()。但为什么不是 md5?
  • 你也可以使用 aes....这就是我问这个问题的原因。大声笑

标签: php security encryption


【解决方案1】:

如果您存储的密码是加密的,它可以被解密。由于许多人在许多不同的系统中重复使用密码,这是一件坏事。因此,您可以使用单向函数,即加密哈希函数 - 这样就可以验证密码而不实际泄露。

正如 Greg 所说,AES 是一种加密/解密算法。 MD5 和 SHA 系列都是散列函数,比较适合使用。但是现在要避开 MD5 - 它不再被视为足够安全。王晓云在 2005 年发布了针对它的有效碰撞攻击,现在它的强度被认为远低于其设计强度 - 因此在密码学术语中它被“破坏”了。

为了获得最佳结果,标准是对密码进行加盐和哈希处理以存储它 - 谷歌这些术语一前一后,你会发现很多参考。

【讨论】:

  • 只要加盐良好,md5 就没有直接的 md5 散列那么不安全,并且适用于大多数网站;虽然我自己仍然使用 SHA 系列或成熟
  • 它的盔甲上有一个裂缝。这并不意味着使用 MD5 加盐和散列存储的密码是易受攻击的……但是。但是,由于盔甲上的裂缝可能导致进一步的攻击,如果你有替代品,为什么还要冒险呢?
  • 顺便说一句。 SHA*1* 并不比 md5 好多少。
  • @svens 已经产生了许多 md5 冲突,迄今为止还没有产生一个 sha1 冲突。目前 NIST 仍然可以使用 sha1,因为使用 md5() 显然是一个漏洞。
  • 人们真的应该使用 bcrypt,而不是加密哈希函数。
【解决方案2】:

简而言之:AES 是可逆的。哈希函数不是。

响应接受的答案...(对不起,我是新用户,还不能发布 cmets...) Salting 只能防止基于 Rainbow Table 的攻击。它不保护“弱密码”。为了保护较弱的密码,您需要使用已被证明很慢的哈希函数。正确配置的 bcrypt 是最简单的方法。 MD5 和 SHA1 太快而无法保证安全。 (用MD5发现的冲突与我描述的这个问题无关)

this dude in a single day 可以破解所有使用 MD5 或 SHA1 加密的 8 字符密码(即使经过适当的加盐)。盐渍并不能防止这种攻击。将攻击“优化”为仅包含约 50 万个英语单词……而其中 10,000 个最常见的变体将破解大量密码。

BCrypt 对这种攻击的抵抗力更强,因为它(可以配置为)比 MD5 慢数百万倍。迭代使用 MD5 一百万次理论上会达到同样的效果,但我建议您坚持使用经过良好测试的库,而不是滚动您自己的实现。 BCrypt 当然也使用 Salting,并且在大多数编程语言中都可用。所以没有理由不使用它。

理论上,SCrypt 更好,但它太新了(因此,实现可能仍然有点错误)

长话短说:SHA512 vs. Blowfish and Bcrypt

【讨论】:

    【解决方案3】:

    不建议使用对称(或非对称)加密来保护密码的主要原因是:密钥管理。使用加密时,您必须保护加密密钥(或派生密钥的熵)。而保护密钥是一项非常难以解决的任务。散列(使用 SHA、MD5 或任何其他算法)解决了密钥保护问题,因为您不需要保留任何秘密值(盐除外,但盐的敏感性明显低于加密密钥;您可以将盐存储在纯文本)。因此,如果您仅出于身份验证目的保留密码(由您的应用程序执行),则绝对没有理由使用加密;散列就可以了。但是,在某些情况下,您可能需要能够解密密码(例如,您可能需要将用户凭据传递给第三方应用程序)。这是唯一一种情况,在这种情况下,使用加密来存储密码是合理的。

    【讨论】:

      【解决方案4】:

      使用 AES 作为密码的对称密码将是 CWE-257 的变化,并且存在漏洞。可以使用symmetric cipher as a hash function。旧的 unix 密码使用 DES 作为散列函数,而较新的 unix 系统使用 blowfish 作为散列函数。但即使它是一种分组密码,它也被用作单向功能,这是任何密码存储系统的要求。

      对于 php,你应该使用sha256

      【讨论】:

      • CWE-257 听起来很奇怪。 “如果系统管理员可以直接恢复密码,(...)管理员可以在其他帐户上使用密码。”我的意思是,当您每次登录时都将密码以明文形式发送给管理员时,哈希密码对您有何帮助?
      • @el.pescado 恶意管理员可以修改应用程序以记录纯文本密码。但是,我认为这个 cwe 很重要,因为根据黑客的规定,可以获得密钥并且可以一举解密所有密码。这使得像 sql 注入这样的攻击更加严重。绝对没有理由使用分组密码来削弱您的应用程序。
      • ...除非您想提供强大的身份验证协议,这通常需要可逆密码。然而,这在 PHP 应用程序中通常不是这样。
      • 某人可能有权访问密码文件,但无法更改系统上的代码。使用单向散列函数存储密码可以最大限度地降低密码文件对攻击者的有用性。
      【解决方案5】:

      因为 AES 加密是对称的。给定使用 AES 和密钥加密的密码,您可以解密密码。这是不可取的,因为您几乎总是希望只有密码的所有者知道它,并且不希望有一种简单的方法来导出密码。另一方面,SHA 和 MD5 算法对密码执行(大部分)单向转换。没有任何信息(密钥)可以让您将转换后的密码恢复为明文形式。

      【讨论】:

      • AES 的对称特性与解密能力无关 - 您也可以解密使用非对称加密算法加密的内容。
      • 我认为他的意思是对称,如双向双向
      【解决方案6】:

      MD5 (Message-Digest algorithm 5) 是加密哈希函数,而Advanced Encryption Standard (AES) 是对称密钥加密算法,因此它们用于不同的目的。像 MD5 或 SHA 这样的哈希用于验证密码,因为它很难反转,即从哈希字符串中获取密码。另一方面,AES 加密是可逆的,如果您知道密钥,则可以获得原始消息。因此,如果多个消息使用相同的密钥加密,知道它会公开所有消息,而如果您设法找到哈希的原始字符串(彩虹表等),您只会发现该特定实例的纯文本,并且您将不得不重做工作以找到另一个哈希字符串的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多