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

安装指南上写着,

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

这让我进退两难.在future ,我可能想更换服务器,但我也不想要弱密码.便携式密码哈希是一个很大的风险吗?更重要的是,它们是什么意思?是字符长度吗?

推荐答案

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

根据PHP版本的不同,您不需要启用可移植散列.在PHP5.3和更高版本上,如果系统上没有bcrypt,PHP会提供自己的bcrypt实现.If all your servers have PHP 5.3 and above, I highly recommend to turn portable hashes off. PHPass"可移植散列"之所以存在,是因为根据安装的PHP版本,bcrypt可能不可用.

也就是说,PHPass portable hash确实将盐存储在其hash中.这就是为什么每次在相同密码下运行都是不同的.

此外,PHPass在生成这些散列*期间使用PHP_VERSION来判断该版本可用的md5()函数是否支持$rawMode参数.如果没有,则使用pack()将十六进制数据转换为二进制(请注意,这比简单地使用$rawMode要慢得多,这就是进行分支的原因).

同样,如果您的所有服务器都运行PHP5.3或更高版本,我强烈建议您关闭便携模式,让PHPass使用bcrypt.由于PHP5.3+在SYSTEM One不可用时提供其自己的实现,因此您的散列将可以跨操作系统进行判断.即使您确实关闭了便携模式,PHPass仍然足够聪明,能够以正确的方式判断您的旧散列.

*第131行


EDIT:更多的解释,这里是如何在便携模式下生成散列的(简化,不使用在PHPass中找到的实际变量,但是准确).请注意,PHPass使用他们自己的Base64编码版本.

  1. $final = '$P$'

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

  3. $final .= genSalt()(SALT为6字节.8字节的"encode64"格式).

  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

Database相关问答推荐

避免数据库联接的两个查询替换

PostgreSQL 嵌套 INSERTs / WITHs 用于外键插入

MySQL 慢查询日志(log) - 慢有多慢?

何时将数据库称为嵌入式数据库?

如何开始使用 SQLCipher for android?

Android Room持久性库@Update不起作用

当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

如何禁用 Django 查询缓存?

如何在 Products 表的主键和自然键之间做出决定?

如何在 Play 2.0 中 for each 环境设置不同的数据库?

保存图像:文件还是 blob?

恢复数据库备份时出错

如何使用 Hibernate 在不丢失数据的情况下更新数据库模式?

如何在 PostgreSQL 事务中获得实时?

你如何记录你的数据库 struct ?

显式事务回滚是否必要?

用于存储文件夹系统的数据库模式的 Select

在连接表中,Rails 缺少组合键的最佳解决方法是什么?

Oracle order NULL LAST 默认

做或不做:将图像存储在数据库中