СОЛЬ И ХЭШ с использованием pbkdf2
Я использую следующие методы для создания защищенного и хешированного пароля из библиотеки crypto lib в nodejs:
crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)
Какой размер я должен использовать для вызова randomBytes (создания SALT)? Я слышал 128-битные соли, может быть, до 256-битных. Похоже, что эта функция использует размер в байтах, поэтому можно ли предположить, что 32 размера (256 бит) достаточно?
Для вызова pbkdf2, какое количество итераций хорошее и какая длина ключа (keylen)?
Также для хранения я видел примеры хранения соли, длины, итераций и ключа Dervied в одном столбце. Я использую пример, который отделяет 4 ::
т.е.
salt::derivedKey::keyLength::iterations
Делая это, я могу затем отделить на ::
чтобы получить 4 значения, чтобы я мог сгенерировать производный ключ на основе предоставленного пароля, чтобы увидеть, соответствует ли он. Это правильный способ хранить это? Или я должен быть немного более "обманчивым" в объединении этих ценностей?
2 ответа
1. Случайный размер байтов:
Соли должны быть как минимум того же размера, что и ваша хэш-функция, поэтому для sha256
Вы должны использовать как минимум 32 байта. Node.js Crypto's 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. Как хранить переменные:
Обсуждаемые во всех приведенных выше ссылках (особенно в первой), соли должны сохраняться вместе с паролями (но никогда не использоваться повторно в других местах), обычно путем добавления их сначала в результирующую строку (salt:hash) или в другой столбец базы данных.
Что касается других переменных, их знание не критично для нарушения безопасности (как указано в Принципе Керкхоффса, так что вы можете безопасно параметризовать его где угодно. Ваш способ сделать это, разделив их с помощью "::", подойдет, но вы экономите лишние информация. Только коды Crackstation "algorithm:iterations:salt:hash"
так что в вашем случае, "salt::derivedKey::iterations"
это все, что тебе нужно.
Фернандо в основном прав, но остерегайтесь того, что #3 исходит от источника. Рекомендуемая длина соли - 64 бита, а не байты.
Использование 64 байтов для полученного ключа допустимо, но для соли это было бы излишним.