什么是最佳的scrypt工作的因素?(What are optimal scrypt work fa

2019-06-25 15:39发布

我使用的Java scrypt库的密码存储。 它要求一个Nrp当我加密东西值,其它的文档是指作为“CPU成本”,“存储器成本”和“并行化成本”参数。 唯一的问题是,我真的不知道他们的具体内容是,或将是什么良好的价值观对他们; 也许它们在某种程度上对应-t,-m和-M开关在科林·珀西瓦尔的原始应用程序 ?

有没有人有这方面的任何建议吗? 库本身列出N = 16384,R = 8,P = 1,但我不知道这是强还是弱还是什么。

Answer 1:

作为一个开始:

cpercival提到在他的幻灯片,从2009年的东西约

  • (N = 2 ^ 14,R = 8,P = 1)<100毫秒(交互使用),并
  • (N = 2 ^ 20中,r = 8,P = 1)<5秒(敏感存储)。

这些数值正好是用于一般用途(密码-DB对一些Web应用程序)即使在今天(2012-09)足够好。 当然,具体情况取决于应用。

此外,这些值(大部分)是指:

  • N :总的工作因素,迭代次数。
  • r :BLOCKSIZE在使用基础散列; 微调的相对内存成本。
  • p :并行化因子; 微调的相对CPU成本。

rp是指以适应潜在的问题,随着预期的CPU速度和内存大小和带宽不增加。 如若CPU性能提升快,可以增加p ,应改为在内存技术的突破提供了数量级的改善命令,可以增加rN有跟上的每部分时间跨度的表现一般一倍。

重要提示:所有的值发生变化的结果。 (更新:)这就是为什么所有scrypt参数都存储在结果字符串的原因。



Answer 2:

为scrypt操作所需的存储器的计算公式为:

128个字节× N_cost × r_blockSizeFactor

为你引用的参数( N=16384r=8p=1

128×16384×8 = 16777216个字节= 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参数为矩形。 哪里:

  • 需要宽度的存储器的量(128 * N * r)的
  • 进行高度的迭代次数
  • 将得到的面积为整体硬度

  • cost (N)同时增加内存使用迭代
  • 所述blockSizeFactor (r)的增加内存使用情况

其余的参数parallelization (P)意味着你必须做整个事情2,3次以上:

如果你有比CPU更多的内存,你可以计算并行的三个独立的路径 - 要求三倍的记忆:

但在所有现实世界的实现,它在一系列的计算,三倍所需的计算:

在现实中,从来没有人选择了p比其他因子p=1

什么是理想的因素是什么?

  • 尽可能多的RAM,你能抽出
  • 为尽可能多的时间,你可以饶!

奖金表

上述图形版本:

笔记:

  • 纵轴是对数标度
  • 成本因素(水平)本身是log(迭代= 2 CostFactor)
  • 强调了在r=8曲线

和放大的上述版本的合理区域:



Answer 3:

我不想踩在上面提供的优良的答案,但没有人真正谈论为什么“R”具有它的价值。 由科林·珀西瓦尔的Scrypt文件所提供的低级别的答案是,它涉及到“内存延迟,带宽积”。 但到底是什么,实际上意味着什么呢?

如果你正在做Scrypt正确的,你应该有一个大的内存块,大多是坐在主内存。 主存储器需要时间从去拉。 当块跳跃循环的迭代首先从大块选择的元素混入工作缓冲器,它必须等待100ns的数据到达的第一个块的量级上。 然后,它有权要求另一个,并等待它的到来。

当r = 1时,你会做4NR Salsa20 / 8次迭代 2n个延迟充满从主存储器中读取。

这是不好的,因为这意味着攻击者可以通过构建一个系统,降低延迟到主内存忘记你的优势。

但是,如果你加大研发投入和成比例下降N,你都能够达到同样的内存需求,做同样的计算量为前 - 除了你所交易的一些随机访问的连续访问。 延伸的顺序访问允许CPU或有效地预取的数据的下一个所需的块库中。 而初始延迟仍存在,在减少或消除延迟为后来的块平均值的初始延迟了到最低水平。 因此,攻击者将受益于改善他们的存储技术在你的小。

然而,减少随r的收益点,而且是关系到“内存延迟,带宽积”提到前。 这是什么产品表明是数据的多少字节可以在任何给定的时间是从主内存到处理器中转。 这是同样的想法高速公路 - 如果它需要10分钟,从A点移动到B点(延迟),以及道路提供了10辆/分钟,从点A(带宽),点A和点之间的巷道B点B包含100辆。 所以,最佳的ř涉及多少64字节块数据的可以请求一次,以掩盖该初始请求的等待时间。

这改善了算法的速度,让您要么增加N代表多个存储器和计算或增加p表示更多的计算,根据需要。

还有随“R”太多了,我还没有看到太多讨论的其他一些问题:

  1. 加大研发而增大或减小n减少伪随机的数量围绕存储器跳跃。 顺序访问更容易进行优化,并且可以给攻击者的窗口。 正如科林·珀西瓦尔注意到我的Twitter上,更大的[R可能允许攻击者使用成本较低,速度较慢的存储技术,降低他们的成本相当( https://twitter.com/cperciva/status/661373931870228480 )。
  2. 工作缓存器的大小为1024R位,所以可能的终产物,这将最终被送入PBKDF2以产生Scrypt输出密钥,数为2 ^ 1024R。 排列的(可能的序列)周围的大的存储器块的跳跃的数目是2 ^ NlogN。 这意味着,有记忆跳回路的2 ^ NlogN可能的产品。 如果1024R> NlogN,这似乎表明,工作缓冲区正处于混合。 虽然我不知道这是肯定的,并希望能看到一个证明或反证,有可能为到工作缓冲区的结果和跳跃的序列,这可能允许攻击者之间找到相关性的机会,以减少他们的内存需求不作为,大大提高了计算成本。 再次,这是一种基于数字的观察 - 这可能是因为一切都在每一轮这么好混,这是没有问题的。 R = 8是远低于标准的N = 2 ^ 14这个潜在阈值 - 对于N = 2 ^ 14,该阈值将是R = 224。

综上所有的建议:

  1. 选择R刚好足够大,以平均出您的设备并没有更多的内存延迟的影响。 请记住,价值科林·珀西瓦尔建议,R = 8,似乎仍然相当广泛最佳的内存技术,而这显然没有在08年变化不大; 16可能是非常轻微更好。
  2. 决定的内存块,你希望有多大每个线程使用,牢记这会影响计算时间为好,并相应集合N。
  3. 增加P任意高到您的使用情况可以容忍什么(注:我的系统上,用我自己的实现,P = 250(4线程)与N = 16384和r = 8大约需要5秒),并启用线程,如果你能处理与增加的内存成本。
  4. 当调谐,选择大N和内存块的大小增加p和计算时间。 Scrypt的主要好处来自它的大内存块的大小。

我自己的上曲面临3与i5-4300(2个核,4个线程)执行Scrypt的基准,使用恒定128Nr = 16 MB和p = 230; 左轴是秒,底轴是r值,误差棒是+/- 1标准偏差:



文章来源: What are optimal scrypt work factors?