我使用的Java scrypt库的密码存储。 它要求一个N
, r
和p
当我加密东西值,其它的文档是指作为“CPU成本”,“存储器成本”和“并行化成本”参数。 唯一的问题是,我真的不知道他们的具体内容是,或将是什么良好的价值观对他们; 也许它们在某种程度上对应-t,-m和-M开关在科林·珀西瓦尔的原始应用程序 ?
有没有人有这方面的任何建议吗? 库本身列出N = 16384,R = 8,P = 1,但我不知道这是强还是弱还是什么。
我使用的Java scrypt库的密码存储。 它要求一个N
, r
和p
当我加密东西值,其它的文档是指作为“CPU成本”,“存储器成本”和“并行化成本”参数。 唯一的问题是,我真的不知道他们的具体内容是,或将是什么良好的价值观对他们; 也许它们在某种程度上对应-t,-m和-M开关在科林·珀西瓦尔的原始应用程序 ?
有没有人有这方面的任何建议吗? 库本身列出N = 16384,R = 8,P = 1,但我不知道这是强还是弱还是什么。
作为一个开始:
cpercival提到在他的幻灯片,从2009年的东西约
这些数值正好是用于一般用途(密码-DB对一些Web应用程序)即使在今天(2012-09)足够好。 当然,具体情况取决于应用。
此外,这些值(大部分)是指:
N
:总的工作因素,迭代次数。 r
:BLOCKSIZE在使用基础散列; 微调的相对内存成本。 p
:并行化因子; 微调的相对CPU成本。 r
和p
是指以适应潜在的问题,随着预期的CPU速度和内存大小和带宽不增加。 如若CPU性能提升快,可以增加p
,应改为在内存技术的突破提供了数量级的改善命令,可以增加r
而N
有跟上的每部分时间跨度的表现一般一倍。
重要提示:所有的值发生变化的结果。 (更新:)这就是为什么所有scrypt参数都存储在结果字符串的原因。
为scrypt操作所需的存储器的计算公式为:
128个字节×
N_cost
×r_blockSizeFactor
为你引用的参数( N=16384
, r=8
, p=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参数为矩形。 哪里:
cost
(N)同时增加内存使用和迭代 。 blockSizeFactor
(r)的增加内存使用情况 。 其余的参数parallelization
(P)意味着你必须做整个事情2,3次以上:
如果你有比CPU更多的内存,你可以计算并行的三个独立的路径 - 要求三倍的记忆:
但在所有现实世界的实现,它在一系列的计算,三倍所需的计算:
在现实中,从来没有人选择了p
比其他因子p=1
。
什么是理想的因素是什么?
上述图形版本:
笔记:
r=8
曲线 和放大的上述版本的合理区域:
我不想踩在上面提供的优良的答案,但没有人真正谈论为什么“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”太多了,我还没有看到太多讨论的其他一些问题:
综上所有的建议:
我自己的上曲面临3与i5-4300(2个核,4个线程)执行Scrypt的基准,使用恒定128Nr = 16 MB和p = 230; 左轴是秒,底轴是r值,误差棒是+/- 1标准偏差: