codeigniter 4 加密系统彻底重构,基于 openssl 实现 aes-256-gcm 认证加密,密钥由 hash_pbkdf2 派生、iv 自动绑定、服务容器注入,强制环境变量管理密钥并校验格式。

CodeIgniter 4 的加密配置与 CI3 相比,不是简单升级,而是彻底重构——核心从“手动密钥管理+简易封装”转向“基于 PHP OpenSSL 扩展的现代密码学实践”,安全性和可维护性显著提升。
加密驱动由 Mcrypt 彻底转向 OpenSSL
CI3 默认依赖已废弃的 Mcrypt 扩展(PHP 7.2+ 已移除),仅提供基础 AES-128-CBC 加密;CI4 强制使用 OpenSSL,默认支持 AES-256-CBC 和 AES-256-GCM(后者带认证加密,防篡改)。这意味着:
- CI3 的
$config['encryption_key']是固定长度字符串,直接参与加解密运算; - CI4 的密钥由系统自动生成并安全派生(通过
hash_pbkdf2),不再允许用户直接传入原始密钥字符串; - CI4 默认启用 IV(初始化向量)随机生成并自动绑定到密文头部,无需开发者手动管理。
配置方式从全局数组变为服务容器注入
CI3 在 application/config/config.php 中写死密钥:
$config['encryption_key'] = 'your-32-char-secret-here';
CI4 完全取消该配置项,改为在 app/Config/Encryption.php 中声明:
-
driver:指定为
'OpenSSL'(唯一支持选项); -
key:必须是 32 字节(AES-256)的二进制密钥,推荐用
bin2hex(random_bytes(32))生成并存入环境变量; -
digest 和 cipher 可显式指定(如
AES-256-GCM),不设则用默认值。
加密服务通过依赖注入获取:$encrypter = \Config\Services::encrypter();,不再全局可用。
加解密接口更严格、更安全
CI3 的 $this->encrypt->encode() / decode() 接口隐式处理填充和编码,易出错且不透明;CI4 统一为:
-
$encrypter->encrypt($data):返回 Base64 编码的完整密文(含 IV + 认证标签); -
$encrypter->decrypt($cipherText):失败时抛出EncryptionException,不返回 false 或空字符串; - 所有操作默认启用认证加密(GCM 模式下),解密时自动校验完整性,篡改密文会直接失败。
密钥生命周期与环境隔离成为标配
CI4 要求密钥必须通过环境变量(如 app.secret)注入,禁止硬编码在配置文件中。框架启动时会校验密钥长度和格式,不符合要求直接报错退出——这堵死了 CI3 中常见的“测试密钥上线”“密钥明文提交 Git”等高危操作。
不复杂但容易忽略











