PHP7中的Argon2i - 选择适当的选项

时间:2018-01-18 11:36:15

标签: php hash php-7.2 argon2-ffi

我应该使用什么值来生成Argon2i哈希值?如何找到我的硬件可以承受的适当设置?

即:

memory_cost
time_cost
threads

为:

$options = [
    'memory_cost' => 1<<17,
    'time_cost'   => 4,
    'threads'     => 3,
];

$hash = password_hash('test', PASSWORD_ARGON2I, $options);

a simple script in PHP docs来查找bcrypt哈希值的相应成本值。如何安装Argon2?

1 个答案:

答案 0 :(得分:2)

来自:PHP RFC Argon2 password_hash

成本因素

来自:

  

由于PHP运行的平台种类繁多,因此在使用默认成本参数时,故意将成本因素设置得较低,以免意外耗尽共享或低资源系统上的系统资源。因此,用户应调整成本因素以匹配他们正在处理的系统。以下列表使用这些默认成本值概述了各种系统上的散列性能。

Common Cloud Server 512 MB, 1 Core: 3-5 ms
Common Cloud Server 2 GB, 2 Core, 1-3 ms
512 MB Raspberry Pi Zero: 75-85ms
     

由于Argon2没有任何“坏”值,因此消耗更多资源被认为比消耗更少资源更好。鼓励用户调整他们正在开发的平台的成本因素。

线程

来自:What Is The Recommended Number Of Iterations For Argon2

  

argon2 paper给出了以下程序(释义),用于确定您应该使用的参数:

     
      
    1.   
    2. 计算出你可以使用的线程数,相应地选择$ h $。
    3.   
  •   
    1.   
    2. 计算出你可以使用多少内存,相应地选择$ m $。
    3.   
  •   
    1.   
    2. 确定您可以花费的最大时间$ x $,选择最大的$ t $,以便系统和其他参数选择花费少于$ x $。
    3.   
  •   
     

即。他们建议您在系统上运行它,并确定与内存和处理器时间使用限制相匹配的最大参数。

来自氩2规范

link here

  
      
  • 并行度p决定了可以运行多少个独立(但同步)的计算链。它可能需要1到2 ^ 24 -1

  • 的任何整数值   
  • 内存大小m可以是8p到2 ^ 32之间的任何整数千字节数   -1。实际的块数为m′m向下舍入到4p的最接近倍数。

  •   
  • 迭代次数t(用于独立于内存大小调整运行时间)可以是1到2 ^ 32 -1之间的任何整数

  •   

进一步的文献

From Here

  
      
  • 计算每次调用Argon2时可以使用的线程数(并行度)。他们建议使用专用于散列密码的内核数量的两倍。

  •   
  • 计算每次通话可以花多长时间。对concurent用户登录的一个建议是将其保持在0.5ms以下。

  •   
  • 使用所选参数测量散列的时间。找一个在你的计算时间内的time_cost。如果time_cost = 1花费太长时间,则降低memory_cost。

  •   

结论:

因此,从上面的摘录中,您似乎希望以PHP 0.5ms衡量的microtime的时间跨度,就像在BCrypt示例中一样。 然后,您可以将线程的数量设置为CPU运行的核心数的两倍,因此对于4核处理器,请说8。

然后,您应该能够使用以上两个值运行一系列测试,以找到 memory_cost 的有效第三个值。

在您的服务器上运行一些测试,以查看服务器可以轻松管理的内容。 探索if this CLI可以提供帮助。

按照上面引用的顺序更改三个变量(在 线程 下),因此使用大的迭代次数调整内存。

简而言之,我们无法为您提供最好的建议&#34;指导因为它取决于什么规格。你打算在......上运行这个...