【问题标题】:Database encryption - php/mysql数据库加密 - php/mysql
【发布时间】:2011-07-15 06:28:55
【问题描述】:

我对使用密码创建数据库的最佳方式有一些疑问。我需要对密码进行加密,但是如果我使用 MD5,我就无法恢复通行证,不是吗?

base64 编码器呢?安全吗?使用这种加密,恢复不再是问题。

建议?什么是最好的方法? e 更喜欢一种允许记住旧密码而不是定义新密码的解决方案。

谢谢!!!

如果有人知道关于数据库中安全密码的好教程,我真的很感激

【问题讨论】:

  • 您需要一个双向密码,例如 DES3,但随后您会引入密钥管理、彩虹表和加盐等问题。具有简单重置而不是恢复的单向散列更为规范。密码应该过期,如果用户不记得它,那么现在是一个新密码的好时机。
  • 我删除了加密标签。这是关于消息摘要功能。同样在将来,您应该搜索 SO 来寻找这样一个通用问题。

标签: php mysql database security


【解决方案1】:

现在停下来阅读this。然后去找一个开源库做用户认证。我不是 PHP 开发人员,所以我不能向您推荐一个,但我确信它们存在。他们已经发现了安全漏洞。

此外,对于密码,您应该查看 bcrypt 或类似的慢速哈希函数来获取密码,而不是使用 MD5 或 SHA 等快速哈希算法。

【讨论】:

    【解决方案2】:

    首先,有一个Significant Difference Between Hashing and Encryption。我建议您在继续之前先阅读一下...

    现在,关于您的确切问题,有几种方法可以解决。

    1. 使用强密码加密您的密码,以便您可以在必要时对其进行解密。解决方案such as the one in this post 可能适用于此。但是,请注意这不是一个好主意,因为如果您的系统遭到入侵,所有密码都会泄露(绝不是一个好主意)。 很少用例将它们加密存储是有意义的,但如果您绝对必须,请使用强大的加密例程来执行此操作...

    2. 使用强大的单向哈希方法存储您的密码。不,md5($password) 还不够好。但sha1($salt . $password) 也不是。第一个是trivial to lookup most passwords,第二个可以通过简单的反复试验在合理的时间内暴力破解。相反,stretch your passwords iteratively。最好的方法是使用标准的PBKDF2 函数从密码生成一个强大的单向密钥。

      至于如果用户忘记密码如何恢复,不用担心。如果用户忘记了他的密码,请创建一个新密码并将其提供给用户。这是处理忘记密码的行业标准方法(见鬼,Windows 和 Mac 都是这样做的)。您可能认为将其发送给用户是在帮他们一个忙,但您所做的只是让任何知道安全性线索的人在每次使用您的应用程序时都无法使用(并且很多 如果您受到损害,人们会生气)。

    【讨论】:

      【解决方案3】:

      如前所述,在保存密码时使用散列而不是加密。我通常不使用随机盐,因为这意味着数据库中有一个额外的字段,以便您可以对用户进行身份验证。最简单的解决方案是使用密码作为盐,如下所示。易于使用且易于验证。

      $salt = $_POST['password'];
      $hash = sha1( $salt . $_POST['password'] );
      

      【讨论】:

        【解决方案4】:

        MD5 不用于加密(这意味着它可以被解密),而是用于消息消化/散列。 Base64也不是加密而是编码,可以毫不费力地解码。

        如果密码很容易被解密,那么在数据库中存储加密密码通常没有什么意义。

        安全的方法是只存储散列,并在动态散列后将提交的密码与存储的散列进行比较。

        您应该按照以下方式做一些事情:

        $salt = 'some2%string!!here1';
        $hash = sha1( $salt . $_POST['password'] );
        

        创建密码的哈希值。您将该哈希存储在数据库中。当用户想要登录时,您获取他提交的函数,使用相同的过程对其进行散列,并与数据库中的散列进行比较。如果匹配,则密码正确。

        【讨论】:

        • 你知道任何学习你建议的教程吗?比较哈希
        • 为了额外的安全性,请为每个用户随机生成您的$salt。
        【解决方案5】:

        您永远不需要记住用户的密码 - 这样做会违反他们的信任并存在安全漏洞。

        通常您将使用 MD5 对密码进行哈希处理(现在最好使用 SHA-2),当用户提交密码以尝试登录时,也会对该密码进行哈希处理,并查看哈希是否匹配.

        为了增加安全性,您可以在数据库中创建一个“盐”列,并在首次提交密码时生成一个随机盐。将盐添加到密码的开头,然后对其进行哈希处理。将 salt+password 的哈希值和 salt 存储在一起。现在,当用户提交密码登录时,您可以将其与 salt 结合,对其进行哈希处理,然后检查哈希是否匹配。

        盐确保如果多个用户具有相同的密码(他们很有可能),他们的密码哈希值将不相同。

        如果用户忘记了他们的密码,他们将不得不提供一个新密码,简单地存储他们的密码并在他们忘记时将其发回给他们是不好的做法,并且向用户表明您没有很好地处理他们的隐私.

        【讨论】:

          【解决方案6】:

          base64 不是“加密”。它旨在将二进制数据转换为安全的格式,以便通过无法正确处理 8 位二进制数据的潜在“损坏”电子邮件系统进行传输。相当于麦片盒解码环。

          如果您想要加密,可以使用 AES、DES 和各种其他功能。问题是,如果您的代码可以解密密码,那么攻击者很容易弄清楚您是如何做到的,和/或颠覆您的代码来为他们解密。

          密码永远不应该以可以检索明文的格式存储。如果用户忘记了他们的密码,您可以清除旧密码,生成一个新的临时密码,并强制他们在首次登录时将此临时密码更改为其他密码。

          【讨论】:

            【解决方案7】:

            如果我使用 MD5 我无法恢复通行证, 不是吗?

            确实,如果您hash 使用 md5 或 sha1 的密码 (添加 salt 是个好主意,顺便说一句),您将无法恢复密码; 这就是这样做的目标!

            我们的想法是,如果有人能够查看您的数据库(无论是某些作恶者,还是您的一名员工——可能是作恶者),他不会能够找到任何有用的密码。


            什么是最好的方法? e 更喜欢允许 记住旧的通行证,而不是定义 一个新的密码。

            最好的方法是做与你想要的相反的事情:不允许一个人得到他的旧密码 - 并开发一些生成新密码的方法。

            这样,您将确保没有人能够获得您的登录信息和相应密码的转储;这将使您的服务对您的用户更安全(特别是考虑到许多人使用多个网站的相同登录名/密码)。

            【讨论】:

            • 迂腐提示:您将无法直接反转密码。但是,您可以使用彩虹表(谷歌甚至可以像这样)找到x = md5(pass) 的解决方案。因此,虽然它在理论上是不可逆的,但在实践中它是......
            • 因此括号里是关于使用盐的 ;-)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-10-28
            • 2019-07-01
            • 2018-02-27
            • 2021-01-14
            • 2016-07-13
            • 1970-01-01
            • 2019-10-24
            相关资源
            最近更新 更多