【问题标题】:Portable (PHPass) password hashes. Should I use them?便携式(PHPPass)密码哈希。我应该使用它们吗?
【发布时间】:2011-07-17 15:33:44
【问题描述】:

我正在为我的网站安装用户注册脚本 (Tank Auth)。

在安装指南中说,

警告:默认情况下,库生成强大的系统特定 不可移植的密码哈希。 这意味着一旦创建,用户 数据库无法转储和导出 到另一台服务器。这种行为可以 在配置文件中也可以更改。

这让我进退两难。将来我可能想更改服务器,但我也不想要弱密码。便携式密码散列是否存在很大风险?更重要的是,它们所说的哈希是什么意思?是字符长度吗?

【问题讨论】:

  • 这不是题外话,它是关于 PHPass 在非便携模式下生成的哈希的可移植性。

标签: php database passwords phpass


【解决方案1】:

Task Auth uses PHPass for password hashing(旧版本,这不是一个好兆头;您可能希望在安装中使用update that)。 PHPpass有两种模式,便携和bcrypt。

根据 PHP 版本,您不需要启用可移植哈希。在 PHP 5.3 及更高版本上,如果系统上不可用,PHP 会提供自己的 bcrypt 实现。 如果您的所有服务器都安装 PHP 5.3 及更高版本,我强烈建议关闭便携式哈希。 PHPass“便携式哈希”存在是因为,根据安装的 PHP 版本,bcrypt 可能不可用。 p>

也就是说,PHPass 可移植哈希确实将盐存储在其哈希中。这就是为什么每次使用相同的密码运行都是不同的。

此外,PHPass 在生成这些哈希时使用PHP_VERSION* 来检查该版本可用的md5() 函数是否支持$rawMode 参数。如果没有,pack() 用于将十六进制数据转换为二进制(请注意,这比简单地使用 $rawMode 慢得多,这就是创建分支的原因)。

同样,如果您的所有服务器都运行 PHP 5.3 及更高版本,我强烈建议关闭便携模式并让 PHPass 改用 bcrypt。由于 PHP 5.3+ 在系统不可用时提供了自己的实现,因此您的哈希将可以跨操作系统检查。即使您确实关闭了便携模式,PHPass 仍然会足够聪明地以正确的方式检查您的旧哈希。

* 131 行


编辑:更多解释,这里是在可移植模式下如何生成哈希(简化,不使用 PHPass 中的实际变量,但准确)。请注意,PHPPass 使用自己的 base64 编码版本。

  1. $final = '$P$'

  2. $final .= encode64_int($rounds)(来自构造函数,PHP 5+ 上最少为 5,其他为 3)

  3. $final .= genSalt()(Salt 是 6 个字节......“encode64”格式的 8 个字节)。

  4. $hash = md5($salt . $password)

  5. 对于2$rounds次,做$hash = md5($hash . $password)

  6. $final = encode64($hash)

所以最终的哈希基本上是这样的:

$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
\__________/\____________________/
  \                   \
   \                   \ Actual Hash
    \
     \  $P$   9   IQRaTwmf
        \_/   \   \______/
         \     \      \
          \     \      \ Salt
           \     \ 
            \     \ # Rounds (not decimal representation, 9 is actually 11)
             \
              \ Hash Header

【讨论】:

  • 感谢您的提醒,删除了我的答案,所以没有人会弄错。
  • 为什么 PHPass 在烘焙便携式哈希时不使用 BLOWFISH 而不是不安全的 MD5?
猜你喜欢
  • 1970-01-01
  • 2014-11-19
  • 2012-03-19
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多