Во-первых, давайте сделаем резервную копию и быстро рассмотрим PBKDF2:
PBKDF2 генерирует вывод с желаемым количеством байтов в длину.Он генерирует эти байты, вычисляя количество «блоков».Каждый блок - это размер выбранного хэша.Например, если вы хотите получить ключ длиной 64 байта и использовать SHA-256, который создает 32-байтовые хэши, вы сгенерируете 2 блока PBKDF2.Окончательный результат - конкатенация этих блоков.
Так как сгенерировать каждый блок?
Хорошо, (и я буду использовать здесь номенклатуру RFC), блоки генерируются функцией,F
.Эта функция принимает пароль пользователя P
, вашу соль S
, желаемое число итераций c
и индекс блока, который вы генерируете i
(на основе одного).
ДляВаш первый блок, ваш вызов функции будет похож на: F ("MySecretPassword", "random_salt", 100000, 1)
(Обратите внимание, что я использую итераций по 100 тыс. Для получения дополнительной информации о выборе этого значения см. этот пост .)
Возвращаясь к RFC:
F(P, S, c, i) = U_1 \xor U_2 \xor U_3 ... U_c
U_1 = PRF(P, S || INT(i))
U_2 = PRF(P, U_1)
U_3 = PRF(P, U_2)
...
U_c = PRF(P, U_{c-1})
PRF
обозначает псевдослучайную функцию.Который для SHA-256 должен быть HMAC на основе SHA-256.Функция работает, сначала генерируя SHA-256 HMAC для вашего пароля P
, используя вашу соль S
, соединенную с номером блока i
.Затем функция выполняет итерацию (c
раз), и XOR возвращает результат с предыдущим результатом.Каждая итерация использует SHA-256 HMAC (снова) для хеширования пароля P
, но использует предыдущий результат в качестве ключа HMAC.
Итак - чтобы вернуться к вашему вопросу - потому что мы используем HMAC,длина соли не имеет значения ** и может быть больше 256 бит.Когда HMAC предоставит ключ (в данном случае ваш пароль) длиннее, чем длина вашего хеш-вывода, он будет хешировать ключ, чтобы получить ровно 256 бит.Если указан ключ короче 256 бит, он дополняется до 256 бит.В некотором смысле, эти детали скрыты от вашей реализации, поэтому вам не нужно беспокоиться о том, как долго соль вы переходите в PBKDF2.
** Что ж, в некоторой степени имеет значение ,См. Комментарий Owlstead к другому ответу.Это должно быть достаточно долго, чтобы расстроить использование радужных столов.(Хотя PBKDF2 применяет вашу хэш-функцию много раз, длинная соль менее важна, чем в традиционных приложениях с «прямым хэшированием».) Для своего приложения я использую 32-байтовую случайную соль, уникальную для каждой учетной записи пользователя, в которой я работаю.хешируя свой пароль с помощью PBKDF2.
Надеюсь, это поможет!