2013-06-20 2 views
20

Я использую следующие методы, чтобы создать соленый и хэшируются пароль от крипто Lib в nodejs:ОСВ и HASH используя PBKDF2

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 значения, так что я могу генерировать производный ключ на основе предоставленного пароля, чтобы увидеть если он совпадает. Правильно ли это это хранить? Или я должен быть немного более «обманчивым» в сочетании этих ценностей?

ответ

24

1. Случайные байты Размер:

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

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

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

3. Длина PBKDF2:

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

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

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

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

+0

«Поскольку стандарт PBKDF2 рекомендует соли не менее 64 бит, это отходы для генерации ключей, меньших, чем ваш вход, поэтому используйте как минимум 64 байта». вход соли должен быть длиной всего 8 байтов (64 * бит *), есть ли где-то здесь опечатка? – StrangeWill

+0

@StrangeПожалуйста, да, см. Комментарий Майкла. Но я редактирую свой ответ, чтобы отразить это. –

+1

На самом деле, поскольку мой ответ старый и уже принят, я бы не стал его менять так сильно. Но размеры, выделенные жирным шрифтом в # 1 и # 3, будут изменяться на ** 20 байт ** рекомендуется - PBKDF2 рекомендует 64 бита, поэтому 8 байтов, но соли должны быть как минимум одного и того же размера хеш-функций, поэтому для SHA1 в случае узла. js Crypt, который будет 20 байтов, а SHA256 будет 32 байта. –

3

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

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

+0

Вы правы, чтобы указать на мою ошибку. Тогда мой вывод на № 3 изменится на соль * 32 байта *. Обоснование этого исходит из первой статьи: «Хорошее эмпирическое правило заключается в использовании соли того же размера, что и выход хеш-функции». Итак, если он использует SHA-256, его соль должна быть такой же, как и выход (32 байта), что выше рекомендуемого минимума в 64 бит. –