代码之家  ›  专栏  ›  技术社区  ›  kumarmo2

PBKdf2 c.net的性能

  •  1
  • kumarmo2  · 技术社区  · 7 年前

    我需要为我们的系统实现密码散列机制。我正在使用 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 回复  |  直到 7 年前
        1
  •  4
  •   Luke Joshua Park    7 年前

    如您所说,目标的标准延迟是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);
    }