PHP框架加密审计必须逐行检查密钥生成、算法选择、IV使用及完整性校验:禁用ECB/DES/RC4等不安全算法,AES-128-CBC不推荐,优先选用AES-256-GCM并配套tag验证,密钥严禁硬编码,IV须密码学随机且不复用,CBC模式必须结合HMAC-SHA256校验。

在PHP框架审计中识别加密算法是否安全,必须逐行检查代码中密钥生成、算法选择、IV使用、完整性校验等关键环节,不能仅凭函数名判断——【openssl_encrypt()调用不等于安全,AES-128-CBC也不等于合规】。
第一步:定位所有加密解密函数调用点
全局搜索 openssl_encrypt、openssl_decrypt、mcrypt_encrypt(已废弃)、password_hash、hash_hmac、random_bytes 等函数,重点关注控制器、模型、中间件、配置类中的调用位置。
用 IDE 的「Find Usages」功能逐个打开调用处,排除日志记录、测试代码、注释残留等干扰项;只保留生产环境实际执行的加密路径。
对每个调用点记录:算法名称、密钥来源、IV生成方式、是否校验完整性、是否启用 PKCS#7 填充。
立即学习“PHP免费学习笔记(深入)”;
第二步:验证密钥是否硬编码或可预测
方法一:检查密钥是否直接写死在代码里
【若发现类似 $key = '12345678901234567890123456789012' 或 md5('my_secret') 这类写法,立即标记为高危】。这类密钥一旦源码泄露,全部密文可在 3 秒内批量解密。
方法二:检查密钥是否从环境变量加载
确认是否通过 $_ENV['APP_KEY']、getenv('ENCRYPTION_KEY') 或 $_SERVER['ENCRYPTION_KEY'] 获取;进一步验证该环境变量是否在部署时由运维注入,而非由 .env 文件明文提交到 Git。
方法三:检查密钥是否动态生成
若密钥含 time()、microtime()、$_SERVER['REQUEST_TIME'] 等时间因子,需人工验证其熵值是否足够——【时间戳本身只有秒级精度,无法提供 128 位以上熵,禁止单独用作密钥】。
第三步:确认算法与模式是否符合现代安全标准
逐条比对每个 openssl_encrypt() 调用的第二个参数(算法标识符):
AES-256-GCM ✅ 允许,必须配套使用 openssl_encrypt(..., ..., ..., OPENSSL_RAW_DATA, $iv, $tag) 并验证 $tag;
AES-256-CBC ✅ 可用,但必须搭配 HMAC-SHA256 完整性校验(先加密后计算 MAC),且 IV 必须每次随机生成;
AES-128-CBC ❌ 不推荐,密钥长度不足,NIST 已建议淘汰;
DES / 3DES / RC4 ❌ 禁用,存在已知可利用漏洞;
BF-CBC / CAST5-CBC ❌ 无广泛审计,PHP 官方不推荐。
特别注意:rijndael-128 不等于 AES-128,前者是原始 Rijndael 实现,块大小不固定,易引发填充错误;必须显式使用 AES-128-CBC 或 AES-256-GCM 字符串标识。
第四步:检查 IV 是否每次加密都唯一且不可预测
第一步:查看 IV 是否调用 openssl_random_pseudo_bytes(16) 或 random_bytes(16) 生成;
第二步:确认 IV 没有被重复复用——例如从 session 或缓存中读取旧 IV,或在循环中未重置;
第三步:验证 IV 是否随密文一同存储/传输(如 base64_encode($iv).'|'.base64_encode($ciphertext)),且解密时严格分离 IV 与密文;
【若 IV 来自 md5(microtime()) 或 uniqid(),视为无效——这些函数输出不具备密码学随机性】。
第五步:验证完整性保护是否真实生效
对使用 CBC 模式的加密逻辑,必须检查是否存在独立的 HMAC 校验步骤:
① 加密后是否调用 hash_hmac('sha256', $ciphertext, $hmac_key, true) 生成认证标签;
② 解密前是否先用相同密钥和算法重新计算 HMAC,并用 hash_equals() 对比原始标签与计算结果;
③ 若使用 GCM 模式,是否将 $tag 参数传入 openssl_encrypt() 并在解密时传入对应 $tag;
【跳过 HMAC 校验或使用 strcmp() 比对标签,会导致 padding oracle 攻击风险】。



















