php - CRYPT_BLOWFISH 中盐的长度

标签 php bcrypt

在 PHP 手册中指出:

CRYPT_BLOWFISH - Blowfish hashing with a salt as follows: "$2a$", a two digit cost parameter, "$", and 22 digits from the alphabet "./0-9A-Za-z".

我意识到 盐的长度是 22。我编写了以下代码并注意到 salt 的输出长度是 21

$encoded = crypt('pass','$2a$08$QAZXSWEDCVFRTGBNHYUJMK'); // Lenght of Q . . . K is 22
echo $encoded;

输出:

$2a$08$QAZXSWEDCVFRTGBNHYUJM./CR85.t4YytTnmLXsRJMfbYWopbT8Nu

Ksalt 中不存在:QAZXSWEDCVFRTGBNHYUJM

有什么我不明白的?

最佳答案

这是由于盐的编码方式。实际盐为 128 位,但 crypt 格式中的编码盐为 22 个字符 · 8 位/字符 · 3/4 = 132 位。因此实际上并没有使用 4 位编码盐。

这也意味着有 16 个编码盐产生相同的散列,因为它们的最低有效字符的前四位相同:

$hashes = array();
$chars = array_merge(array('.','/'), range('A','Z'), range('a','z'), range('0','9'));
foreach ($chars as $char) {
    $salt = 'QAZXSWEDCVFRTGBNHYUJM'.$char;
    $hashes[$salt] = crypt('pass','$2a$08$'.$salt);
}
var_dump($hashes);

这里是产生相同散列的编码盐:

QAZXSWEDCVFRTGBNHYUJM.
QAZXSWEDCVFRTGBNHYUJM/
QAZXSWEDCVFRTGBNHYUJMA
QAZXSWEDCVFRTGBNHYUJMB
QAZXSWEDCVFRTGBNHYUJMC
QAZXSWEDCVFRTGBNHYUJMD
QAZXSWEDCVFRTGBNHYUJME
QAZXSWEDCVFRTGBNHYUJMF
QAZXSWEDCVFRTGBNHYUJMG
QAZXSWEDCVFRTGBNHYUJMH
QAZXSWEDCVFRTGBNHYUJMI
QAZXSWEDCVFRTGBNHYUJMJ
QAZXSWEDCVFRTGBNHYUJMK
QAZXSWEDCVFRTGBNHYUJML
QAZXSWEDCVFRTGBNHYUJMM
QAZXSWEDCVFRTGBNHYUJMN

crypt 可能只是使用第一个编码内部使用的 128 位盐,即 QAZXSWEDCVFRTGBNHYUJM。

关于php - CRYPT_BLOWFISH 中盐的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727257/

相关文章:

PhpStorm 无法识别 Php 文件

php - 关于 php 和 ajax-jquery 的问题

java - 如何在 Coldfusion8 中使用 javaloader 设置 java 库?

javascript - 我将 bcrypt 安装到我的 package.json 时没有什么问题

javascript - 使用 Node bcrypt 在 mysql 中散列和存储密码后用户登录的最佳实践

ruby-on-rails - 使用 BCrypt 更新密码

php - 是否可以通过 post 发送 json 数组?

php - 将 String 与 Integer 进行比较会得出奇怪的结果

PHP和SQL上传错误

c# - C#中的哈希密码?密码/PBKDF2