我想在我的Symfony 4编码器中使用Argon2i,因为我已经看过多篇关于它应该如何比bcrypt或pbkdf2更好的文章。不幸的是,我不知道我的系统上的memory_cost、time_cost或线程使用什么值。什么是好的价值观,我如何才能确定我的价值观应该是什么?
发布于 2018-09-28 18:42:33
什么是好的价值观?
基于您的服务器,这是非常主观的。@Martin对这个这里做了一个非常好的描述,您可以阅读RFC规范这里。但总结一下(或许还可以分享我的个人观点/最佳答案)-“好的”价值观是指:
- 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
所有这些(以及这篇文章最初的目的),下面的测试是试图帮助您找到对您的系统有用的价值观。请注意,如果您曾经更改您的硬件/OS/web服务器服务/对您的服务器的一些重大更改,您应该始终重做这些计算。另外,不要在dev服务器上运行这个程序,设置值,并认为它们在生产服务器上是相同的--您应该在打算使用代码的每个服务器上这样做。
测试:
下面是一个简单的测试,只涉及一个小树枝文件和一个控制器。然后,它将使用带有指定值的Argon2i执行哈希。将迭代设置为1以上将允许我们计算平均值(也许更准确)。最后,它会给出一个不同的值,并用一个简单的红色或绿色标记它,以便告诉你结果是什么。
花枝:
<form action="{{ path('test') }}" method="post">
<p>
<label for="time_cost">Time Cost:</label>
<input type="text" id="time_cost" name="time_cost" value="{{ last_time_cost }}" />
</p>
<p>
<label for="memory_cost">Memory Cost:</label>
<input type="text" id="memory_cost" name="memory_cost" value="{{ last_memory_cost }}" />
</p>
<p>
<label for="thread_cost">Thread Cost:</label>
<input type="text" id="thread_cost" name="thread_cost" value="{{ last_thread_cost }}" />
</p>
<p>
<label for="iterations">Iterations (how many times to compute the hash):</label>
<input type="text" id="iterations" name="iterations" value="{{ last_iteration }}" />
</p>
<p>
<label for="desired_time">Desired Time in seconds. Normal system: 0.5, High security: 1 (or higher).:</label>
<input type="text" id="desired_time" name="desired_time" value="{{ last_desired_time }}" />
</p>
<p>
<label for="password">Password to hash:</label>
<input type="text" id="password" name="password" value="{{ last_password }}" />
</p>
<button type="submit">Run Test</button>
<div>Average seconds taken (over {{ last_iteration }} iterations): {{ total }}</div>
<div>Ideal seconds taken: {{ last_desired_time }}</div>
<div>Difference: <span style="color:{{ style }}">{{ diff }}</span></div>
</form>控制器:
/**
** @Route("/test", name="test")
*/
public function test(Request $request)
{
$time_cost = $request->request->get('time_cost');
$memory_cost = $request->request->get('memory_cost');
$thread_cost = $request->request->get('thread_cost');
$desiredTime = $request->request->get('desired_time');
$iterations = $request->request->get('iterations');
$password = $request->request->get('password');
if (empty($memory_cost) || !is_numeric($memory_cost))
$memory_cost = 16384;
if (empty($time_cost) || !is_numeric($time_cost))
$time_cost = 2;
if (empty($thread_cost) || !is_numeric($thread_cost))
$thread_cost = 4;
echo $desiredTime;
if (empty($desiredTime) || (!is_numeric($desiredTime) &&!is_float($desiredTime)))
$desiredTime = 0.25;
if (empty($iterations) || !is_numeric($iterations))
$iterations = 10;
if (empty($password))
$password = 'correct horse battery staple';
$options = [
'memory_cost' => $memory_cost,
'time_cost' => $time_cost,
'threads' => $thread_cost
];
$totalTime = 0;
for($i = 1; $i <= $iterations; $i++)
{
$start = microtime(true);
password_hash($password, PASSWORD_ARGON2I, $options);
$end = microtime(true);
$total = $end - $start;
$totalTime = $totalTime + $total;
}
$diff = $desiredTime - $totalTime / $iterations;
if ($diff > 0 || $diff < -0.50)
$style = 'red';
else
$style = 'green';
return $this->render('index/test.html.twig', array(
'last_thread_cost' => $thread_cost,
'last_time_cost' => $time_cost,
'last_memory_cost' => $memory_cost,
'last_iteration' => $iterations,
'last_desired_time' => $desiredTime,
'last_password' => $password,
'total' => $totalTime / $iterations,
'diff' => $diff,
'style' => $style,
));
}一旦您获得了适合您的环境的值,就可以在security.yaml中为您的编码器设置它们。
security.yaml /app/config/packages/security.yaml
注意:这里有示例值。不要使用它们(w/o测试),使用上面的方法来找到您的值。
security:
...
encoders:
App\Security\SecurityUser:
algorithm: argon2i
memory_cost: 102400
time_cost: 3
threads: 4https://stackoverflow.com/questions/52561074
复制相似问题