php 7.3 与 8.1 的 hash_hmac() 接口和算法支持基本一致,区别在于:8.1 新增 hash_hmac_algos() 精确获取 hmac 专用算法,且增强类型校验与大小写敏感性;推荐固定使用 sha256/sha512 并用 hash_equals() 验证。

PHP 7.3 和 8.1 的 hash_hmac() 函数本身接口和行为一致,都支持相同的底层算法集合——关键区别在于如何获取可用算法列表,以及对不安全算法的隐含建议强度。
hash_hmac() 实际支持的算法在 7.3 和 8.1 中基本相同
hash_hmac() 能用哪些算法,取决于 PHP 编译时启用的哈希扩展,而非 PHP 主版本号。只要底层 OpenSSL 或系统库支持,两者都能用:
- 安全推荐的:
sha256、sha384、sha512、sha3-256、sha3-512 - 兼容但已不推荐的:
sha1、md5(NIST 已明确不适用于新系统) - 其他历史算法(如
ripemd160、whirlpool、haval256,5等)在两个版本中通常都存在,但极少用于 HMAC 场景
注意:
md2、md4、snefru等极弱算法虽仍列在hash_hmac_algos()结果中,不代表应被选用。
获取支持算法的方式有实质性变化
这是最实际的区别点:
-
PHP 7.3:没有
hash_hmac_algos()函数(该函数从 7.2.0 才引入),只能调用hash_algos(),但它会返回所有散列算法(包括crc32、adler32等不适用于 HMAC 的非加密算法),开发者需自行过滤。 -
PHP 8.1:可直接使用
hash_hmac_algos(),返回专为 HMAC 设计的、经过验证可用的加密类算法列表(共 44 个,含sha256、sha3-256、ripemd160等),无需人工排除校验和或非加密算法。
安全行为更严格(尤其在类型处理上)
PHP 8.1 强化了参数类型校验,影响 hash_hmac() 的调用鲁棒性:
- 若传入
null、array或对象给$data或$key参数,PHP 7.3 可能静默转换为字符串(如array()→"Array"),而 PHP 8.1 直接抛出TypeError - 对算法名大小写更敏感:
'SHA256'在 7.3 可能被容忍,在 8.1 更可能失败(建议始终小写,如'sha256')
推荐做法(兼容且安全)
- 固定使用
sha256或sha512:它们在两个版本中稳定、快速、广泛支持 - 生成密钥时用
random_bytes()(PHP 7.0+),别用openssl_random_pseudo_bytes()(8.1 已废弃) - 验证签名时务必用
hash_equals()防时序攻击,不要用=== - 不依赖
hash_algos()判断 HMAC 可用性;PHP 8.1 起优先用hash_hmac_algos(),PHP 7.3 可硬编码白名单(如['sha256', 'sha384', 'sha512'])
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











