Производительность PBKDF2 c # .NET с - PullRequest
0 голосов
/ 22 мая 2018

Мне нужно реализовать механизм хэширования паролей для нашей системы.Я использую PBKDF2 для этой цели.Я сделал небольшое консольное приложение для демонстрации.С параметрами, которые я использую, он берет мой рабочий стол 56 ms для генерации окончательного хэша.

Из источников, которые я прошел, они упомянули, что время генерации 100 мс должно быть разумно обеспечено.Это правильное предположение или я должен замедлить свое поколение?Если да, какие параметры мне следует изменить?

КОД:

class Program
{
    static void Main(string[] args)
    {
        var watch = System.Diagnostics.Stopwatch.StartNew();
        byte[] op = null;
        op = GetPDKDF2("password", 20, 10000);
        watch.Stop();
        Console.WriteLine("total time: " + watch.ElapsedMilliseconds);
        Console.ReadKey();
    }

    public static byte[] GetPDKDF2(string password, int saltSize, int iterationCount)
    {
        var pdf = new Rfc2898DeriveBytes(password, saltSize, iterationCount);
        return pdf.GetBytes(20);
    }

}

1 Ответ

0 голосов
/ 22 мая 2018

Стандартная задержка для достижения цели, как вы сказали, составляет 100 мс.Время, необходимое для вычисления хэша с PBKDF2, пропорционально количеству итераций.Имея это в виду, вы, вероятно, могли бы просто удвоить количество итераций, чтобы получить задержку около 100 мс.

Я предлагаю не допускать изменения количества итераций, по крайней мере, в качестве аргумента функции.Изменение количества итераций в будущем по мере продвижения оборудования является хорошей идеей, но необходимо убедиться, что используемый счетчик итераций отмечен в произведенном хэше.

Вместо этого я бы использовал постоянное значение для счетчика итераций.:

const int ITERATION_COUNT = 20000;

И использование:

public static byte[] GetPDKDF2(string password, int saltSize)
{
    var pdf = new Rfc2898DeriveBytes(password, saltSize, ITERATION_COUNT);
    return pdf.GetBytes(20);
}
...