php 8.0 默认仍用 password_bcrypt,非显式指定且环境支持时不会自动启用 password_argon2id;须运行时验证 defined('password_argon2id')、extension_loaded('sodium') 及 password_hash() 实际返回值,参数键名必须小写,哈希字符串需完整存储于 varchar(255) 字段。

PHP 8.0 默认仍用 PASSWORD_BCRYPT(不是 PASSWORD_ARGON2ID),除非你显式指定且环境支持 Argon2。别看到“PHP 8.0 支持 Argon2”就以为它自动启用——绝大多数线上环境(包括官方 Docker 镜像、主流云主机)默认不启用 libsodium 或未编译 Argon2 支持,password_hash() 调用 PASSWORD_ARGON2ID 会直接返回 false。
怎么确认 PHP 8.0 真的能用 PASSWORD_ARGON2ID
不能只查 PHP 版本。必须运行时验证:
-
defined('PASSWORD_ARGON2ID')必须为true(PHP ≥ 7.3 是前提,但不保证启用) -
function_exists('password_hash')和extension_loaded('sodium')建议一并检查——libsodium是 Argon2ID 的底层依赖,缺一不可 - 实测调用:
var_dump(password_hash('test', PASSWORD_ARGON2ID));若返回false,说明环境不支持,别硬上
password_hash() 调用 PASSWORD_ARGON2ID 的正确参数写法
Argon2 参数不能省略或错位,PHP 8.0 对 $options 键名大小写敏感(比如写成 'Memory_cost' 会警告并忽略):
- 必须用小写键名:
['memory_cost' => 65536, 'time_cost' => 4, 'threads' => 3] -
memory_cost单位是 KiB,默认 65536 = 64MB;低内存容器(如 512MB RAM 的轻量服务器)可能 OOM,上线前压测 -
time_cost是迭代次数,threads是并行线程数;三者共同决定耗时,别只调高一个 - 不传
$options会用 PHP 内置默认值,但默认memory_cost=65536在资源受限环境风险高
为什么 password_verify() 能直接验证 Argon2 哈希
因为 Argon2 哈希字符串本身已编码全部参数,例如:
$argon2id$v=19$m=65536,t=4,p=1$U1loZThCYWtXcnpYWWV3NA$52eO0Ig9a1/pwqK3NPeNxwQpRuml36pjN2UN5BaGVGo
其中 m=65536、t=4、p=1 全部明文可见。password_verify() 解析这些字段后,用完全相同的配置重算一次哈希——盐值也包含在 $U1loZThCYWtXcnpYWWV3NA$ 段里,无需额外存储或提取。
所以你存进数据库的必须是完整字符串(长度可达 255 字符),字段类型得是 VARCHAR(255);如果用 CHAR(60) 或中间 trim()、substr() 截断,验证必然失败。
常见失败场景和绕过陷阱
真实线上问题往往出在“以为对了,其实没生效”:
- 开发机支持 Argon2,但测试/生产环境没装
sodium扩展 →password_hash()静默 fallback 到PASSWORD_BCRYPT,而你代码没做返回值判断,导致存的是 bcrypt 哈希却误以为是 Argon2 - 数据库字段是
VARCHAR(60),存PASSWORD_BCRYPT没事,但 Argon2 哈希超长被截断 → 登录时password_verify()收到损坏字符串,永远返回false - 注册时用了
PASSWORD_ARGON2ID,登录验证却漏写第三个参数,直接用password_verify($pass, $hash)—— 这个本身没错,但若后续想升级 cost 参数,password_needs_rehash($hash, PASSWORD_ARGON2ID, [...])就要求$hash真是 Argon2 格式,否则永远返回false
最易被忽略的一点:Argon2 哈希字符串里含 $ 符号,若你用某些 ORM 或 SQL 构建器做参数绑定时手动拼接 SQL(比如 "WHERE password = '$hash'"),可能触发意外截断或语法错误——必须走预处理或至少 mysqli_real_escape_string() 处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











