php没有php-safe-password包,因其并不存在于packagist;安全密码哈希应直接使用php原生password_hash()和password_verify()函数,默认bcrypt(php 5.5+)或argon2id(php 7.2+需启用扩展)。

PHP-Safe-Password 并不是一个真实存在的 Composer 包——它不存在于 Packagist,也没有官方维护版本。直接运行 composer require php-safe-password 会报错:Package php-safe-password not found。
为什么搜不到 php-safe-password?
这是一个常见误解:开发者常把“安全密码哈希”当成某个具体库的名字,但 PHP 自身已内置符合现代安全标准的原生函数。所谓“安全密码哈希”,核心是使用 password_hash() 和 password_verify(),它们默认采用 bcrypt(PHP 5.5+),并支持 argon2(PHP 7.2+,需编译时启用 libsodium 或 argon2 扩展)。
- 没有叫
php-safe-password的标准库,Packagist 上也无同名稳定包 - 部分第三方小众包可能用类似命名,但无社区共识、无持续维护、不推荐用于生产
- 真正需要的不是“安装一个名字带 safe 的库”,而是正确使用 PHP 原生密码 API
替代方案:用原生 password_hash() 实现合规哈希
PHP 的 password_hash() 已满足 OWASP 和 NIST 对密码存储的要求(自动生成盐、可调迭代次数、抗时序攻击)。无需额外依赖。
- 默认算法是
PASSWORD_BCRYPT,兼容性好,强度足够 - 如需更强防护且环境支持,可用
PASSWORD_ARGON2ID(需ext-argon2启用) - 哈希结果是完整字符串(含算法、成本因子、盐和密文),直接存数据库即可,无需单独存盐
- 验证只需
password_verify($input, $hash),自动解析参数,不暴露内部结构
// 正确示例:生成与验证
$hash = password_hash('myPass123!', PASSWORD_ARGON2ID, ['memory_cost' => 65536, 'time_cost' => 4, 'threads' => 3]);
if (password_verify('myPass123!', $hash)) {
echo 'Valid';
}
如果坚持要“第三方封装”,该注意什么?
极少数项目会封装一层(比如加类型约束、统一异常、适配旧 PHP 版本),但必须严格审查:
- 检查源码是否只是对
password_hash()/password_verify()的薄包装,而非自行实现哈希逻辑 - 确认未硬编码固定成本因子(如 bcrypt cost=10),应允许运行时配置
- 避免依赖过时扩展(如
mcrypt)或弃用函数(如sha1()+ salt) - 若发现包要求
composer require safe/password或类似,大概率是玩具项目,勿用于生产
真正容易被忽略的是:很多人花时间找“安全密码库”,却忘了检查 PHP 版本是否 ≥ 7.2(否则 PASSWORD_ARGON2ID 不可用),或没在部署时确认 extension=argon2.so 是否加载。哈希安全不取决于包名是否带 “safe”,而取决于是否用对了原生函数、是否更新了运行时环境。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











