php 8.1 内置 password_hash 和 password_verify,无需安装 php-bcrypt 扩展;其底层依赖系统 crypt() 和 openssl,password_bcrypt 是编译时常量而非运行时扩展,验证需实测 defined('password_bcrypt')、crypt() 调用及完整哈希流程。

password_hash 和 password_verify 在 PHP 8.1 中默认可用,无需额外安装扩展。Ubuntu 或其他主流发行版的 php8.1 包(如 php8.1-cli、php8.1-fpm)已内置 PASSWORD_BCRYPT 支持,底层依赖 OpenSSL 和系统级 crypt() 实现,不依赖独立的 php-bcrypt 扩展(该包在较新 Debian/Ubuntu 中已废弃或不存在)。
为什么 php-bcrypt 包在 Ubuntu 上可能装不上或报错
Ubuntu 22.04+ 及 PHP 8.1 官方仓库中已移除单独的 php-bcrypt 包。尝试运行 sudo apt install php-bcrypt 会提示 “unable to locate package” 或依赖冲突。
- PHP 自 5.5 起就将 bcrypt 集成进核心密码函数,
PASSWORD_BCRYPT是编译时启用的常量,不是运行时加载的扩展 -
phpinfo()页面里搜不到 “bcrypt” 模块名是正常的——它不以模块形式存在,也不出现在extension_loaded('bcrypt')检查中 - 真正要检查的是
crypt()函数是否可用,以及PASSWORD_BCRYPT常量是否定义
确认 Bcrypt 功能是否实际可用的三步验证
别只看 phpinfo,要实测:
- 运行
php -r "var_dump(defined('PASSWORD_BCRYPT'));"→ 应输出bool(true) - 运行
php -r "var_dump(crypt('test', '$2y$04$uses2a$'));"→ 若返回长度为 60 的字符串(如$2y$04$...),说明系统crypt()支持 bcrypt - 写个最小测试脚本:
<?php $hash = password_hash('hello', PASSWORD_BCRYPT, ['cost' => 10]); var_dump($hash); var_dump(password_verify('hello', $hash)); ?>输出两个string(60)和bool(true)即表示完全可用
PASSWORD_DEFAULT vs PASSWORD_BCRYPT 怎么选
PHP 8.1 中 PASSWORD_DEFAULT 默认指向 bcrypt(可通过 password_get_info() 验证),但行为受未来 PHP 版本升级影响:
- 用
PASSWORD_BCRYPT能锁定算法,避免某天升级 PHP 后PASSWORD_DEFAULT切到 argon2(虽然目前还没发生) - 显式指定
['cost' => 11]比默认10更抗暴力破解,但单次哈希耗时约翻倍;线上服务建议压测后定为11或12,避免登录接口延迟突增 - 不要手动传 salt ——
password_hash自动调用random_bytes()生成安全盐值;传入自定义 salt 会触发警告且被忽略
关键点其实就一个:PHP 8.1 不需要“安装 Bcrypt”,只需要确认 password_hash 能跑通、crypt() 系统调用没被禁用(比如某些容器环境删了 /usr/bin/crypt 或禁用了 crypt 函数)。真正容易出问题的地方,是开发机和生产环境的 disable_functions 配置不一致,或者用了精简版 Docker 镜像漏掉了 libcrypt。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











