在 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
K 在 salt 中不存在: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/