我正在使用Java scrypt library进行密码存储。当我加密事物时,它需要N
,r
和p
值,其文档称为“CPU成本”,“内存成本”和“并行化成本”参数。唯一的问题是,我实际上并不知道它们的具体含义,或者对它们有什么好的价值;也许它们以某种方式对应Colin Percival's original app上的-t,-m和-M开关?
有人对此有任何建议吗?图书馆本身列出N = 16384,r = 8和p = 1,但我不知道这是强还是弱或者是什么。
答案 0 :(得分:65)
首先:
cpercival 提到in his slides from 2009周围的事情
即使在今天(2012-09),这些值恰好足以满足一般用途(某些WebApp的密码-db)。当然,细节取决于应用程序。
此外,这些值(大多数)意味着:
N
:一般工作因素,迭代次数。r
:用于底层哈希的blocksize;微调相对记忆费用。p
:并行化因素;微调相对cpu-cost。 r
和p
旨在解决CPU速度和内存大小和带宽未按预期增加的潜在问题。如果CPU性能增加得更快,那么增加p
,相反,内存技术的突破提供了一个数量级的改进,你增加r
。并且N
可以跟上每个某个时间段的性能一般加倍。
重要提示:所有值都会更改结果。 (更新:)这就是为什么所有scrypt参数都存储在结果字符串中的原因。
答案 1 :(得分:53)
scrypt操作所需的内存计算如下:
128字节×
N_cost
×r_blockSizeFactor
表示您引用的参数(N=16384
,r=8
,p=1
)
128×16384×8 = 16,777,216字节= 16 MB
选择参数时必须考虑到这一点。
Bcrypt “弱”比Scrypt(虽然仍然是three orders of magnitude stronger than PBKDF2)因为它只需要4 KB的内存。您希望难以并行化硬件中的破解。例如,如果视频卡具有1.5 GB的板载内存,并且您调整了scrypt以消耗1 GB的内存:
然后攻击者无法在其视频卡上并行化。但是,每当他们计算密码时,您的应用程序/电话/服务器就需要使用1 GB的RAM。128×16384×512 = 1,073,741,824字节= 1 GB
这有助于我将scrypt参数视为矩形。其中:
cost
( N )会增加内存使用量和迭代次数。 blockSizeFactor
( r )会增加内存使用量。 剩下的参数parallelization
( p )意味着您必须完成2,3或更多次的整个事情:
如果你的内存多于CPU,你可以并行计算三个独立的路径 - 需要三倍的内存:
但是在所有实际实现中,它是按顺序计算的,需要的计算增加三倍:
实际上,除了p
之外,没有人选择p=1
因子。
理想因素是什么?
上述图形版本:
注意:
r=8
曲线将上面的版本放大到合理的区域:
答案 2 :(得分:11)
我不想踩到上面提供的优秀答案,但没有人真正谈论为什么" r"有它的价值。 Colin Percival的Scrypt论文提供的低级答案是它与内存延迟带宽产品有关"。但这究竟意味着什么?
如果你正确地做Scrypt,你应该有一个大的内存块,它主要位于主内存中。主存储器需要时间来拉动。当块跳转循环的迭代首先从大块中选择一个元素以混合到工作缓冲区时,它必须等待100ns的量级才能到达第一块数据。然后它必须请求另一个,并等待它到达。
对于r = 1,您将从主内存执行4nr Salsa20 / 8次迭代和 2n延迟时间读取。
这并不好,因为这意味着攻击者可以通过构建一个减少主内存延迟的系统来获得优势。
但是如果你增加r并按比例减少N,你就可以达到相同的内存要求并进行与以前相同的计算次数 - 除了你已经进行了一些随机访问以进行顺序访问。扩展顺序访问允许CPU或库有效地预取下一个所需的数据块。虽然初始延迟仍然存在,但后续块的延迟减少或消除将初始延迟平均到最小水平。因此,攻击者从改善他们的记忆技术中获得的收益很少。
然而,随着r的增加,有一个收益递减点,这与内存延迟 - 带宽产品"有关。之前提到的。该产品表示在任何给定时间可以从主存储器传输到处理器的数据字节数。它与高速公路的想法相同 - 如果从A点到B点(延迟)需要10分钟,并且道路从A点(带宽)向道路提供10辆车/分钟到B点A点和B点之间包含100辆汽车。因此,最优r与您可以一次请求多少64字节数据块有关,以便掩盖初始请求的延迟。
这提高了算法的速度,允许您根据需要增加N以获得更多内存和计算,或增加p以进行更多计算。
还有其他一些问题需要增加" r"太多了,我还没有见过多少讨论:
总结所有建议:
我在Surface Pro 3上使用i5-4300(2核,4个线程)实现Scrypt的基准测试,使用常数128Nr = 16 MB和p = 230;左轴为秒,底轴为r值,误差棒为+/- 1标准差: