C#.NET中PBKDF2性能问询:是否需提升哈希生成耗时?
关于PBKDF2密码哈希耗时与参数调整的疑问
我正在为系统实现密码哈希机制,目前采用PBKDF2方案。编写了一个控制台演示程序,当前参数下,桌面设备生成最终哈希耗时56ms。查阅资料得知100ms的生成时间具备合理安全性,请问该假设是否正确?若需进一步提升耗时,应调整哪些参数?
演示代码
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); } }
解答
首先可以明确:100ms的生成时间具备合理安全性这个假设是站得住脚的。
行业内之所以把这个数值作为参考,核心是平衡了用户体验与破解成本:对普通用户来说,100ms的等待几乎感知不到;但对暴力破解的攻击者来说,每尝试一个密码都要付出100ms的成本,当他们要遍历海量密码组合时,总耗时会指数级增长,最终让破解变得不现实。当然这个数值不是绝对的,你可以根据系统场景灵活调整:比如后台高权限管理系统,用户量少、安全要求极高,甚至可以把耗时调到200ms;如果是面向海量普通用户的Web系统,100ms左右是最稳妥的选择,避免用户感受到明显延迟。
如果想要把当前56ms的耗时提升到目标区间,你可以重点调整以下参数:
- 迭代次数(
iterationCount):这是影响PBKDF2耗时最直接的参数。你当前设置的是10000次,想要提升耗时的话,直接增大这个数值即可——比如逐步调到15000、20000,边调整边测试耗时,直到接近100ms。迭代次数和耗时基本呈线性正相关,次数翻倍的话,耗时也会大致翻倍,是最容易调整的变量。 - 哈希输出长度(
GetBytes(20)):这个参数对耗时影响极小,因为PBKDF2的主要耗时集中在迭代的哈希运算环节。只要输出长度在16-32字节的安全范围内,就不需要特意调整,除非你有特殊业务需求。 - 盐值大小(
saltSize):你当前用的20字节盐值已经完全满足安全要求(盐值只要随机唯一,16字节以上就足够),增大盐值大小对耗时的影响微乎其微,所以不建议通过这个参数来提升耗时。
最后补充一点:不同硬件的性能差异很大,你现在是在桌面设备上测试的,要结合系统实际运行环境调整参数。比如如果是服务器端做哈希,服务器CPU性能通常比普通桌面设备强,那你需要在服务器环境下重新测试,调整迭代次数到目标耗时;如果是客户端哈希(不推荐,密码哈希最好放在服务器端执行),还要考虑用户的平均设备性能,避免低配置设备出现过长等待。
内容的提问来源于stack exchange,提问作者kumarmo2
相关产品推荐
相关产品推荐

