首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Symfony 4中找到对memory_cost、线程和time_cost对Argon2i都有好处的值?

如何在Symfony 4中找到对memory_cost、线程和time_cost对Argon2i都有好处的值?
EN

Stack Overflow用户
提问于 2018-09-28 18:42:33
回答 1查看 81关注 0票数 0

我想在我的Symfony 4编码器中使用Argon2i,因为我已经看过多篇关于它应该如何比bcrypt或pbkdf2更好的文章。不幸的是,我不知道我的系统上的memory_cost、time_cost或线程使用什么值。什么是好的价值观,我如何才能确定我的价值观应该是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 18:42:33

什么是好的价值观?

基于您的服务器,这是非常主观的。@Martin对这个这里做了一个非常好的描述,您可以阅读RFC规范这里。但总结一下(或许还可以分享我的个人观点/最佳答案)-“好的”价值观是指:

  • 哈希时间:使哈希在正常系统上占0.5ms -500 or之间(较高的值提供更多安全性,但用户体验更慢)或在高安全系统上使用1s+。再一次,即使这些数字也是非常主观的,这似乎只是一个普遍的共识,基于我所读到的。您希望哈希花费这么长时间的原因是,当黑客试图破解哈希时,每次哈希尝试都要花费一定的时间。正常的黑客攻击可能会在几毫秒内发生,因此将其展开,因此需要更长的时间,基本上要花费很长时间才能破解哈希,因此黑客会(希望?)放弃吧。
  • 内存。更大的服务器将有更大的内存。就目前而言,我想说,在一个拥有相当大的RAM和良好cpu的服务器上,128 my可能是您想要达到的最大值(在撰写本文时),但这只是我的观点。这个值实际上在很大程度上取决于web服务器通常使用内存的方式--您不希望在已经消耗内存的服务器上使用大值。Argon2的缺省值是1MB。在默认情况下,可以找到以下时间
代码语言:javascript
复制
- 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

  • 线程。基本上会占用多少个线程。和memory_cost一样,这种类型围绕着服务器的CPU使用。在我的经验中,我取最大核数并将其除以一半,这通常是一个很好的数字(如果没有其他的话,首先),但是您需要进行实验才能看到。
  • 时间成本。这个值应该是最后计算出来的。从1开始,计算出您想要的memory_cost和线程的值,然后缩放这个值。根据我的经验,如果memory_cost和线程正确,这个数字不会超过5,但这也是非常有争议的。

所有这些(以及这篇文章最初的目的),下面的测试是试图帮助您找到对您的系统有用的价值观。请注意,如果您曾经更改您的硬件/OS/web服务器服务/对您的服务器的一些重大更改,您应该始终重做这些计算。另外,不要在dev服务器上运行这个程序,设置值,并认为它们在生产服务器上是相同的--您应该在打算使用代码的每个服务器上这样做。

测试:

下面是一个简单的测试,只涉及一个小树枝文件和一个控制器。然后,它将使用带有指定值的Argon2i执行哈希。将迭代设置为1以上将允许我们计算平均值(也许更准确)。最后,它会给出一个不同的值,并用一个简单的红色或绿色标记它,以便告诉你结果是什么。

花枝:

代码语言:javascript
复制
<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>

控制器:

代码语言:javascript
复制
/**
 ** @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测试),使用上面的方法来找到您的值。

代码语言:javascript
复制
security:
    ...
    encoders:
        App\Security\SecurityUser:
            algorithm: argon2i
            memory_cost: 102400
            time_cost: 3
            threads: 4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52561074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档