Важность размера ключа в реализации Rfc2898DeriveBytes (PBKDF2)

#c# #hash #cryptography #passwords #pkcs#5

#c# #хэш #криптография #пароли #pkcs#5

Вопрос:

Это код, который я использую для «хэширования» (или получения ключа, как это называется в реализации стандарта PKCS PBKDF2) строк паролей с помощью класса Rfc2898DeriveBytes, предоставляемого в .NET:

 int saltSize = 256;
int iterations = 1000;
int keySize = 20;  // The parameter I'm not sure of

var deriveBytes = new Rfc2898DeriveBytes("mypassword", saltSize, iterations);
byte[] salt = deriveBytes.Sa<
byte[] key = deriveBytes.GetBytes(keySize);
  

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

(Примечания:
1. Вопросы производительности для меня здесь не важны, очевидно, что более длинная соль или более длинный ключ потребуют больше времени для GetBytes возврата значения.
2. Я хочу использовать этот «хэш» для хранения их в базе данных, а не для последующего использования в схеме шифрования)

Комментарии:

1. dkLen предполагаемая длина в октетах производного ключа, положительное целое число, не более 16 для MD2 или MD5 и 20 для SHA-1

Ответ №1:

Обычно вы используете PKCS #5 v2 / RFC2898 для создания симметричного ключа из пароля пользователя. Размер важен, потому что он должен соответствовать требуемому размеру симметричного алгоритма, который вы будете использовать.

 aes.Key = deriveBytes.GetBytes (16); // 16 * 8 = 128 bits
  

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

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

Комментарии:

1. «использование PKCS # 5 версии 2 (или более поздней) займет намного больше времени (количество итераций), чем использование соленого хэша или HMAC» Разве это не причина, по которой вы хотите использовать PKCS # 5 в первую очередь? Более быстрые алгоритмы, на которые проще запускать атаки по словарю и т.д.

2. Основная причина заключается в том, чтобы получить надежные (с точки зрения криптографии) ключи. Но это не причина, по которой алгоритм использовался в вопросе, поэтому ИМХО, было уместно отметить разницу между PKCS # 5 и обработкой / хешированием.

Ответ №2:

keysize — это размер желаемого ключа; Поэтому, если вы хотите получить большой производный ключ, используйте больший размер ключа.

Время, необходимое для увеличения размера ключа, пропорционально int (keysize / hashsize), поэтому вы должны установить keysize как минимум на ту же длину, что и hashsize.

Также следует использовать производные ключи рекомендуемой длины, когда они используются в каком-либо шифре, например AES (128 — 256 бит).