Усиление ключа. Правильно ли я делаю это?

Я пишу класс для хеш-паролей, который реализует Key Stretching с помощью класса System.Security.Cryptography.Rfc2898DeriveBytes для генерации ключей, используемых для вычисления хеш-значения.

Код, по сути, делает следующее:

// Higher iterations value results in better key strength
var db = new Rfc2898DeriveBytes(password + salt + secretKeyFromConfigFile,
                                saltAsBytes,
                                iterations);

byte[] hashKey = db.GetBytes(64); // 64 bytes is the recommended size for the HMACSHA512 class

var sha512 = new System.Security.Cryptography.HMACSHA512(hashKey);

byte[] hashInput = System.Text.Encoding.UTF8.GetBytes(password + salt + secretKeyFromConfigFile);

byte[] hash = sha512.ComputeHash(hashInput);

return System.Convert.ToBase64String(hash);

Документация для System.Security.Cryptography.Rfc2898DeriveBytes указывает, что он использует «... генератор псевдослучайных чисел на основе System.Security.Cryptography.HMACSHA1» для получения ключа.

Поскольку SHA512 лучше, чем SHA1, не лучше ли просто применить хэш-функцию SHA512 таким образом?

byte[] hash;

for (int i = 0; i < iterations; i++)
{
    hash = sha512.ComputeHash(hash ?? hashInput);
}

return System.Convert.ToBase64String(hash);

В чем разница между усилением ключа (как показано в 1-м блоке кода) и усилением хеш-функции (как показано во 2-м блоке кода)?

Какой метод является предпочтительным для растягивания ключей при хешировании паролей?

5
задан Rudy 22 March 2011 в 13:57
поделиться