N
、r
和p
值,文档称之为"CPU cost"、"memory cost"和"parallelization cost"参数。问题是,我不知道它们具体意味着什么,或者它们的好值是多少;也许它们与Colin Percival's original app上的-t、-m和-M开关有某种对应关系吗?请问有人对此有什么建议吗?该库本身列出了N = 16384、r = 8和p = 1,但我不知道这是强还是弱,或者是什么意思。
N
、r
和p
值,文档称之为"CPU cost"、"memory cost"和"parallelization cost"参数。问题是,我不知道它们具体意味着什么,或者它们的好值是多少;也许它们与Colin Percival's original app上的-t、-m和-M开关有某种对应关系吗?N
:工作因素,迭代次数。r
:用于底层哈希的块大小;微调相对内存成本。p
:并行化因子;微调相对CPU成本。r
和 p
旨在解决 CPU 速度、内存大小和带宽未按预期增加的潜在问题。如果 CPU 性能提高得更快,则增加 p
;如果内存技术的突破提供了一个数量级的改进,则增加 r
。而 N
则用于保持与某个时段内性能每倍增长一致。为了验证密码需要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
(N)增加了内存使用量和迭代次数。blockSizeFactor
(r)增加了内存使用量。剩余的参数parallelization
(p)意味着您必须完成整个过程2、3或更多次:
但在所有实际应用中,它是按系列计算的,需要三倍的计算量:
实际上,没有人选择除了p=1
之外的p
因子。
什么是理想的因子?
上述内容的图形版本;您的目标是约为250毫秒:
注意:
r = 8
曲线中突出显示并且在合理的区域内放大了上述内容,再次查看约250ms的数量级:
N < 2^(128*r/8)
。当 r=1
时,简化为 N < 2^16
。我需要深入挖掘一下,但这与内部的 BlockMix
函数使用 ROMix
的方式有关。 - Ian Boyd我不想在上面提供的出色答案中重复,但没有人真正讨论“r”为什么具有特定的值。 Colin Percival的Scrypt论文提供的低级答案是,它与“内存延迟-带宽乘积”有关。但这实际上是什么意思呢?
如果你正在正确使用Scrypt,应该有一个大的内存块,大部分时间都停留在主存储器中。从主存储器中拉取需要时间。当块跳转循环的一次迭代首先从大块中选择一个元素混合到工作缓冲区时,它必须等待约100 ns才能到达第一块数据。然后它必须请求另一个,并等待其到达。
对于r = 1,您将进行4nr Salsa20/8迭代以及2n携带延迟的主存储器读取。
这并不好,因为这意味着攻击者可以通过构建具有较低延迟的系统来获得优势。
但是,如果您增加r并成比例地减少N,则能够满足相同的内存要求并执行与之前相同数量的计算--除了您交换了一些随机访问序列访问。扩展顺序访问允许CPU或库有效地预取所需的下一个数据块。虽然最初的延迟仍然存在,但后续块的减少或消除的延迟将初始延迟平均到最小水平。因此,攻击者从改进他们的内存技术中获得的收益很小。
但是,随着r的增加,存在收益递减点,这与先前提到的“内存延迟-带宽乘积”有关。这个乘积指示了可以在任何给定时间从主存储器传输到处理器的字节数。这与高速公路的原理相同--如果从A点到B点需要10分钟(延迟),并且道路以每分钟从A点向B点交付10辆车(带宽),则A和B之间的道路含有100辆车。因此,最佳r与一次可以请求多少64字节数据块相关,以便覆盖该初始请求的延迟。
这将提高算法的速度,使您可以根据需要增加N以获得更多的内存和计算,或者增加p以获得更多的计算。
增加"r"太多还存在其他问题,这些问题我没有看到过讨论:
总结所有建议:
在Surface Pro 3上使用i5-4300(2个核心,4个线程)测试我自己的Scrypt实现的基准测试,使用恒定的128Nr = 16 MB和p = 230;左轴是秒数,底轴是r值,误差条为+/- 1标准差: