Важность размера ключа в реализации Rfc2898DeriveBytes (PBKDF2) - PullRequest
8 голосов
/ 09 ноября 2011

Это код, который я использую для «хэширования» (или получения ключа , как он вызывается в PBKDF2 реализации стандарта PKCS) паролей строк с 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.Salt;
byte[] key = deriveBytes.GetBytes(keySize);

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

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

Ответы [ 2 ]

6 голосов
/ 09 ноября 2011

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

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

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

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

0 голосов
/ 09 ноября 2011

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

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

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

...