Подтвердить что ты не робот

СОЛЬ и ХАШ, используя pbkdf2

Я использую следующие методы для создания соленого и хешированного пароля из crypto lib в nodejs:

crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)

Для вызова randomBytes (создания СОЛЬ) какой размер я должен использовать? Я слышал 128-битные соли, возможно, до 256 бит. Похоже, эта функция использует размер в байтах, поэтому я могу предположить, что размер 32 (256 бит) достаточен?

Для вызова pbkdf2, что такое большое количество итераций и какая хорошая длина для ключа (keylen)?

Кроме того, для хранения я видел примеры хранения соли, длины, итераций и derviedkey в том же столбце. Я использую пример, который разделяет 4 на ::, т.е.:

salt::derivedKey::keyLength::iterations

Сделав это, я могу разделить на ::, чтобы получить 4 значения, поэтому я могу сгенерировать производный ключ на основе предоставленного пароля, чтобы узнать, совпадает ли он. Правильно ли это это хранить? Или я должен быть немного более "обманчивым" в сочетании этих ценностей?

4b9b3361

Ответ 1

1. Размер случайных байтов:

Соли должны быть как минимум того же размера, что и ваша хеш-функция, поэтому для sha256 вы должны использовать не менее 32 байт. Node.js Crypto pbkdf2 использует SHA1, поэтому 20 байтов должны быть минимальными. Однако, по крайней мере, вы должны использовать 64 бита (8 байтов), как описано в № 3. (Источник: https://crackstation.net/hashing-security.htm).

2. PBKDF2 число итераций:

См. этот вопрос для отличной дискуссии. Я взял из него, что 10.000 диапазон достаточно без ударной производительности, но это зависит от оборудования/производительности.

3. Длина PBKDF2:

См. эту другую дискуссию о длине ключа. Параметр снова использует функцию хеширования, в вашем случае SHA-1, поэтому 20 байт является правильным значением. Поскольку стандарт PBKDF2 рекомендует соли не менее 64 бит, это отходы для генерации ключей, меньших, чем ваш вход, поэтому используйте как минимум 8 байт. Не используйте длину вывода больше 20, поскольку она не обеспечивает дополнительной безопасности, но удваивает время вычисления для каждого кратного 20.

4. Как сохранить переменные:

Обсуждаемый во всех ссылках выше (особенно первый), соли следует сохранять по паролям (но никогда не использовать в других местах), обычно добавив его сначала в результирующую строку (соль: хэш) или в другой столбец базы данных.

В отношении других переменных их знания не являются критическими для нарушения безопасности (как указано в Принцип Kerckhoffs, чтобы вы могли безопасно его параметризовать в любом месте. Ваш способ сделать это, разделив их на "::", прекрасен, но вы сохраняете дополнительную информацию. коды Crackstation сохранить только "algorithm:iterations:salt:hash", поэтому в вашем случае "salt::derivedKey::iterations" - это все, что вам нужно.

Ответ 2

Фернандо в основном правилен, но будьте осторожны, что № 3 ошибочно. Рекомендуемая длина соли составляет 64 бит, а не байты.

Использование 64 байтов для производного ключа приемлемо, но будет излишним для соли.