You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP7中Argon2i哈希算法:如何选择合适的参数配置?

Argon2i 参数选择与硬件适配指南

我来分享下Argon2i参数选择的经验,以及如何适配你的硬件配置——这也是很多PHP开发者切换到Argon2i时会遇到的典型问题。

一、核心参数的基础合理值

Argon2i的三个核心参数memory_cost、time_cost、threads各自承担不同的安全与性能角色,先给你一个实用的参考范围:

  • memory_cost(内存消耗,单位KB):
    官方推荐最低值是1<<17(即128MB),这也是PHP的默认配置。如果你的服务器内存充足(比如有4GB以上可用内存),可以提升到1<<18(256MB)甚至1<<19(512MB),但务必保证这个值不超过服务器可用内存的1/4,避免挤占其他服务的资源。
  • time_cost(迭代次数):
    默认值是3,建议在3-10之间调整。这个参数控制哈希计算的循环次数,次数越高破解难度越大,但也会直接增加计算耗时。
  • threads(并行线程数):
    默认值是1,建议设置为服务器CPU物理核心数的一半或全部(比如4核服务器设为2或4)。不要超过物理核心数,否则线程调度的开销会抵消并行计算的优势,反而降低效率。

二、如何确定硬件可承受的最优配置

核心原则是在安全性和用户体验之间找平衡:单次哈希生成的耗时建议控制在100-200毫秒之间。太快的话,攻击者可以快速暴力破解;太慢的话,会影响用户登录、注册的响应速度。

具体步骤:

  1. 一定要在生产环境的服务器上测试(不要用开发机,硬件差异会导致结果偏差);
  2. 逐步调整参数,测试每次哈希生成的耗时;
  3. 最终找到能稳定落在100-200毫秒区间的参数组合。

三、适配Argon2i的硬件检测脚本

你提到PHP文档里有bcrypt的cost值检测脚本,这里我把它改成适配Argon2i的版本,它能自动帮你找到最优参数:

<?php
// 目标耗时区间:100-200毫秒(可根据业务需求调整)
$minTarget = 0.1; // 单位:秒
$maxTarget = 0.2;

// 初始参数(从PHP默认值开始)
$memoryCost = 1 << 17; // 128MB
$timeCost = 3;
$threads = 2;

echo "正在测试Argon2i最优参数配置...\n\n";

// 第一步:调整内存消耗,接近目标耗时
while (true) {
    $start = microtime(true);
    password_hash('test_password', PASSWORD_ARGON2I, [
        'memory_cost' => $memoryCost,
        'time_cost' => $timeCost,
        'threads' => $threads
    ]);
    $duration = microtime(true) - $start;

    echo "memory_cost: {$memoryCost}KB | 耗时: " . number_format($duration, 4) . "秒\n";

    if ($duration >= $minTarget) {
        break;
    }
    // 每次翻倍内存,直到接近目标耗时
    $memoryCost *= 2;
}

// 第二步:微调迭代次数,让耗时落在目标区间
while (true) {
    $start = microtime(true);
    password_hash('test_password', PASSWORD_ARGON2I, [
        'memory_cost' => $memoryCost,
        'time_cost' => $timeCost,
        'threads' => $threads
    ]);
    $duration = microtime(true) - $start;

    echo "time_cost: {$timeCost} | 耗时: " . number_format($duration, 4) . "秒\n";

    if ($duration >= $minTarget && $duration <= $maxTarget) {
        break;
    } elseif ($duration < $minTarget) {
        $timeCost++;
    } else {
        $timeCost--;
        // 如果迭代次数降到1还超时,就降低内存消耗
        if ($timeCost < 1) {
            $memoryCost /= 2;
            $timeCost = 3;
        }
    }
}

// 第三步:根据CPU核心数优化线程数(可选)
$cpuCores = (int)(shell_exec('nproc') ?: 2); // Linux环境获取核心数,Windows可替换为其他方式
$optimalThreads = min($cpuCores, $threads * 2);

echo "\n=== 推荐最优参数 ===";
echo "\nmemory_cost = {$memoryCost}";
echo "\ntime_cost = {$timeCost}";
echo "\nthreads = {$optimalThreads}";
?>

脚本说明:

  • 先逐步提升memory_cost,直到哈希耗时接近目标下限;
  • 再微调time_cost,让耗时稳定落在100-200毫秒区间;
  • 最后根据服务器CPU核心数优化threads参数,最大化利用硬件性能。

额外注意事项

  • 测试时要关闭服务器上的其他高负载服务,确保测试结果准确;
  • 不要盲目追求过高的参数,否则会导致服务器资源耗尽;
  • 定期重新测试:当服务器硬件升级或业务流量变化时,重新运行脚本调整参数。

内容的提问来源于stack exchange,提问作者Archer Sylus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:39:05