BCrypt использует 128 битов для соли, то есть 22 байта Base64, с использованием только двух битов последнего использованного байта.
Хеш вычисляется с использованием соли и пароля. Когда вы передаете зашифрованный пароль, алгоритм считывает силу, соль (игнорируя все, что за ним) и пароль, который вы дали, и вычисляет хеш, добавляя его. Если у вас есть PostgreSQL и pg_crypto, SELECT gen_salt ('bf'); покажет вам, что из $ salt читается.
Вот пример кода для генерации соли из моей .NET-реализации test-vector-gen.php, альтернативно:
$salt = sprintf('$2a$%02d$%s', [strength goes here],
strtr(str_replace(
'=', '', base64_encode(openssl_random_pseudo_bytes(16))
),
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
'./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'));
Нет причин использовать одну и ту же соль для всех ваших паролей. В любом случае, соль является частью вывода, так что вы ничего не получите в удобстве ... хотя я допускаю, что PHP должен иметь встроенную функцию gen_salt.