php 7.3 与 8.2 的 crypt() 函数不新增/移除算法,但 8.2 强制 salt 参数、校验更严、默认行为更安全,且更强调 password_hash() 为首选,系统依赖性增强。

PHP 7.3 和 8.2 的 crypt() 函数本身**不新增也不移除哈希算法类型**,其支持的算法完全取决于底层操作系统(如 Linux glibc)编译时启用的 crypt(3) 实现,PHP 只是封装调用。但两个版本在**行为、安全性要求和兼容性层面有实质性差异**。
盐值(salt)参数从可选变为强制
PHP 7.3 中 salt 仍为可选参数,若省略,PHP 会自动补一个弱 salt(如 DES 的 2 字符或 MD5 的 12 字符),并触发 E_NOTICE;而 PHP 8.0 起 salt 已变为**必填参数**,8.2 中继续严格执行——不传 salt 会直接报 TypeError 或致命错误。这并非算法变化,但显著影响调用方式。
算法识别逻辑未变,但默认行为更严格
crypt() 仍靠 salt 前缀识别算法,常见前缀对应关系保持一致:
- $1$ → CRYPT_MD5(12 字符 salt)
- $2y$、$2a$ → CRYPT_BLOWFISH(bcrypt,22 字符 salt)
- $5$ → CRYPT_SHA256(16 字符 salt)
- $6$ → CRYPT_SHA512(16 字符 salt)
- 纯两字符(如 ab)→ CRYPT_STD_DES(已极度不推荐)
PHP 8.2 并未增加新前缀,也未废弃旧前缀,但对 salt 格式校验更严:非法字符(如空格、非 Base64 字符)、长度不符(如 bcrypt salt 不足 22 字符)、cost 参数越界(如 $2y$03$… 中 03<04)都会导致返回 FALSE 或空字符串,不再静默降级。
与 password_hash() 的协同关系更明确
PHP 7.3 开始全面推广 password_hash() 作为首选,它内部调用 crypt(),但自动选择当前系统支持的最强算法(如 bcrypt),并生成合规 salt;PHP 8.2 进一步强化了对 password_hash() 的 options 校验(如 cost 键名大小写敏感),间接提升了通过 crypt() 生成哈希的安全基线。直接调用 crypt() 的场景在 8.2 中更被视作低层级操作,需开发者自行担责。
系统依赖性凸显,跨环境一致性下降
PHP 7.3 默认可能启用 SHA-512($6$)或 bcrypt($2y$),取决于系统 glibc 版本;PHP 8.2 不改变这一逻辑,但因 salt 强制、格式校验收紧,当部署到较老系统(如仅支持 DES/MD5 的嵌入式环境)时,原本勉强运行的代码更容易失败。开发者必须显式检测 defined('CRYPT_SHA512') && CRYPT_SHA512 等常量,不能依赖自动回退。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











