什么是最佳隐窝工作因素?
我正在使用Java scrypt库进行密码存储。当我加密事物时,它需要一个,并且值,其文档将其称为“CPU成本”,“内存成本”和“并行化成本”参数。唯一的问题是,我实际上不知道它们的具体含义,或者它们有什么好的价值观;也许它们以某种方式对应于科林·珀西瓦尔(Colin Percival)原始应用程序上的-t,-m和-M开关?N
r
p
有人对此有什么建议吗?库本身列出了N = 16384,r = 8和p = 1,但我不知道这是强还是弱或什么。
我正在使用Java scrypt库进行密码存储。当我加密事物时,它需要一个,并且值,其文档将其称为“CPU成本”,“内存成本”和“并行化成本”参数。唯一的问题是,我实际上不知道它们的具体含义,或者它们有什么好的价值观;也许它们以某种方式对应于科林·珀西瓦尔(Colin Percival)原始应用程序上的-t,-m和-M开关?N
r
p
有人对此有什么建议吗?库本身列出了N = 16384,r = 8和p = 1,但我不知道这是强还是弱或什么。
首先:
cpercival在他2009年的幻灯片中提到过一些东西
即使在今天(2012-09),这些值也恰好足以用于一般用途(某些WebApp的密码数据库)。当然,具体情况取决于应用。
此外,这些值(大多数)意味着:
N
:一般工作系数,迭代次数。r
:用于底层哈希的块大小;微调相对内存成本。p
:并行化因子;微调相对 CPU 成本。r
并且旨在解决 CPU 速度、内存大小和带宽不会按预期增加的潜在问题。如果CPU性能提高得更快,你就要提高,反而应该把内存技术的突破提供一个数量级的提高,你就增加了。并且是否能够跟上每段时间跨度性能翻倍的一般速度。p
p
r
N
重要:所有值都会更改结果。(更新时间:)这就是所有 scrypt 参数都存储在结果字符串中的原因。
因此,验证密码需要250毫秒
scrypt 运行所需的内存计算如下:
128 字节 × ×cost (N)blockSizeFactor (r)
对于您引用的参数 (, ,N=16384
r=8
p=1
)
128×16384×8 = 16,777,216 字节 = 16 MB
在选择参数时,您必须考虑到这一点。
Bcrypt比Scrypt“弱”(尽管仍然比PBKDF2强三个数量级),因为它只需要4 KB的内存。您希望使硬件中的并行破解变得困难。例如,如果视频卡具有 1.5 GB 的板载内存,并且您已将 scrypt 调整为占用 1 GB 内存:
128×16384×512 = 1,073,741,824 字节 = 1 GB
然后攻击者无法在其视频卡上并行化它。但是,您的应用程序/电话/服务器每次计算密码时都需要使用1 GB的RAM。
它帮助我将scrypt参数视为矩形。哪里:
cost
blockSizeFactor
剩余的参数 (p) 表示您必须执行整个操作 2 次、3 次或更多次:parallelization
如果您的内存多于 CPU,则可以并行计算三条单独的路径 - 需要三倍的内存:
但在所有实际实现中,它都是按顺序计算的,是所需计算的三倍:
实际上,除了 .p
p=1
理想的因素是什么?
上述图形版本;您的目标是 ~250 毫秒:
笔记:
r=8
并将上面的版本放大到合理的区域,再次查看~250ms的幅度: