Куда девается последний символ соли при генерации хэша функцией crypt()?

Здравствуйте, интересная ситуация получилась. Имеем простой код:

class Test
{
    const CRYPT_PREFIX = '$2y$';

    const CRYPT_COST = '10';

    const CRYPT_SALT = '$thisisahardcodedsaltaa'; // Обратите внимание: на конце две "а"

    const BLOWFISH_PREFIX = self::CRYPT_PREFIX . self::CRYPT_COST . self::CRYPT_SALT;

    public static function token($string): void
    {
        $hash = crypt($string, self::BLOWFISH_PREFIX);

        var_dump($hash);
    }

}

Test::token('123');


Вывод получаем такой (специально не стал оборачивать в код, что бы выделить соль):
string(60) "$2y$10$thisisahardcodedsaltaO3g7GW1sCmfhfAhFlth8T.RT/YkR9USi"


Знатоки, вопрос: куда пропал последний символ соли?

P.S. можно выполнить на onlinephp.io
  • Вопрос задан
  • 202 просмотра
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Отсюда

Blowfish использует в качестве соли не буквально те самые буквы и цифры, которые вы пишете, а воспринимает их как поток бит, закодированный в свой вариант base64. При этом с помощью 22 символов можно закодировать 132 бита ( 22 символа х 8 бит х 3/4 (кодирование в base64) = 132), из которых реально используются только 128. Соответственно, из последнего символа берется только половина бит.

Это в частности означает, что для 16 разных солей хэши будут одинаковые:

thisisahardcodedsaltaO
thisisahardcodedsaltaP
thisisahardcodedsaltaQ
thisisahardcodedsaltaR
thisisahardcodedsaltaS
thisisahardcodedsaltaT
thisisahardcodedsaltaU
thisisahardcodedsaltaV
thisisahardcodedsaltaW
thisisahardcodedsaltaX
thisisahardcodedsaltaY
thisisahardcodedsaltaZ
thisisahardcodedsaltaa
thisisahardcodedsaltab
thisisahardcodedsaltac
thisisahardcodedsaltad


Cудя по всему, blowfish не берет соль как есть, а сначала раскодирует её, использует, а потом кодирует обратно, и при этом кодировании получается первый из возможных вариантов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы