【问题标题】:Encrypting Passwords加密密码
【发布时间】:2010-09-05 06:22:39
【问题描述】:

加密密码的最快且安全的方法是什么(最好使用 PHP),无论您选择哪种方法,它是否可移植?

换句话说,如果我以后将我的网站迁移到不同的服务器,我的密码会继续有效吗?

据我所知,我现在使用的方法取决于服务器上安装的库的确切版本。

【问题讨论】:

    标签: php encryption passwords


    【解决方案1】:

    如果您为您的登录系统选择加密方法,那么速度不是您的朋友,Jeff 与 Thomas Ptacek 就密码问题争论不休,conclusion 是您应该使用最慢、最安全的加密你负担得起的方法。

    来自 Thomas Ptacek 的博客:
    速度正是您在密码哈希函数中不想要的。

    现代密码方案受到增量密码破解程序的攻击。

    增量破解者不会预先计算所有可能的破解密码。他们单独考虑每个密码散列,并通过密码散列函数提供字典,就像您的 PHP 登录页面一样。像 Ophcrack 这样的彩虹表破解器使用空间来攻击密码;像 John the Ripper、Crack 和 LC5 这样的增量破解者使用时间:统计和计算。

    密码攻击游戏以破解密码 X 的时间计分。对于彩虹桌,该时间取决于您的桌需要多大以及搜索速度有多快。使用增量破解器,时间取决于您可以使密码哈希函数运行多快。

    你可以更好地优化你的密码哈希函数,你的密码哈希函数得到的越快,你的方案就越弱。 MD5 和 SHA1,甚至像 DES 这样的传统分组密码,都被设计成速度很快。 MD5、SHA1 和 DES 是弱密码哈希。在现代 CPU 上,原始加密构建块(如 DES 和 MD5)可以进行位切片、矢量化和并行化,以使密码搜索速度快如闪电。 Game-over FPGA 实施仅需数百美元。

    【讨论】:

      【解决方案2】:

      我和彼得在一起。开发人员似乎不理解密码。我们都选择(我也对此感到内疚)MD5 或 SHA1,因为它们速度很快。想一想(因为最近有人向我指出)这没有任何意义。我们应该选择一个愚蠢缓慢的散列算法。我的意思是,在事情的规模上,一个繁忙的网站会散列密码什么?每 1/2 分钟?谁在乎它是否需要 0.8 秒与服务器明智的 0.03 秒?但是这种额外的缓慢对于防止所有类型的常见暴力攻击来说是巨大的。

      根据我的阅读,bcrypt 专为安全密码散列而设计。它基于河豚,有很多实现。

      对于 PHP,请查看PHP Pass

      对于任何使用 .NET 的人,请查看BCrypt.NET

      【讨论】:

        【解决方案3】:

        需要指出的是,你不想加密密码,你想散列它。

        加密的密码可以被解密,让别人看到密码。散列是一种单向操作,因此用户的原始密码(以加密方式)消失了。


        至于你应该选择哪种算法 - 使用当前公认的标准:

        • SHA-256

        当您对用户密码进行哈希处理时,请务必在其他一些垃圾中使用它进行哈希处理。例如:

        • 密码:password1
        • 盐:PasswordSaltDesignedForThisQuestion

        将盐添加到用户密码中:

        String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
        

        【讨论】:

        • -1 SHA-256 不是密码散列函数,因此不安全。它可以是一个的一部分 (PBKDF2),但那是完全不同的东西。此外,您的示例具有误导性,因为 salt 不应该是一个聪明的短语,它应该是一个随机(每个用户)值。
        【解决方案4】:

        无论做什么,都不要编写自己的加密算法。这样做几乎可以保证(除非您是密码学家)算法中存在缺陷,因此很容易破解。

        【讨论】:

        • 即使你是密码学家,它也可能存在缺陷——算法需要多年的审查才能变得“流行”
        • 这是真的。并且让我想起了 Don Knuth 的类似轶事:很久以前,他尝试编写一个随机数生成器,并将他能想到的尽可能多的晦涩操作堆在一起。最后,他运行了这个不朽的创作,它无限期地输出了数字 4。 (细节可能在复述中有所改变。)
        【解决方案5】:

        我不一定要寻找最快但很好的平衡,正在开发此代码的某些服务器相当慢,散列和存储密码的脚本需要 5-6 秒才能运行,并且我已将其范围缩小到散列(如果我评论散列,它会在 1-2 秒内运行)。

        它不一定是最安全的,我不是为银行编码(现在),但我当然 不会 将密码存储为普通密码-文本。

        【讨论】:

        • 关闭后,您仍应尽可能安全地散列密码。获取某人银行帐户密码的最简单方法是什么?创建一个外观精美的网站,让人们在其中注册。大多数人会使用现有的密码。现在你有一个巨大的密码列表。重点是,如果我知道这是一个糟糕的实现,那么获取其他人密码的最快方法就是破解你的系统。
        【解决方案6】:

        考虑使用bcrypt,它用于许多现代框架,如 laravel。

        【讨论】:

          【解决方案7】:

          插入数据库时​​使用该函数 Password_harsh($password,PASSWORD_DEFAULT); 从数据库中选择时,您使用该功能将您插入的密码与数据库中的密码进行比较 if(password_verify($password,$databasePassword)){

          }else{
          echo "password not correct";
          }
          

          这将以安全的格式对密码进行严苛

          【讨论】:

            【解决方案8】:

            password_hash ( string $password , int $algo [, array $options ] )。 (PHP 5 >= 5.5.0,PHP 7)

            password_hash() 使用强大的单向散列算法创建新的密码散列。 password_hash()crypt() 兼容。因此,crypt() 创建的密码哈希可以与password_hash() 一起使用。

            【讨论】:

              猜你喜欢
              • 2010-11-06
              • 2010-10-23
              • 2023-02-03
              相关资源
              最近更新 更多