数据库密码不应加密存储,而应通过环境隔离、权限控制和配置保护保障安全;用户敏感数据才需用codeigniter encryption类加密入库,密钥须为32字节随机二进制值且不可更改。

CodeIgniter 项目中数据库密码本身不建议加密存储,而是应通过环境隔离、权限控制和配置保护来保障安全。真正需要加密的是应用中处理的用户敏感数据(如身份证号、手机号、银行卡号等),而非数据库连接凭证。
数据库密码应放在配置文件中,但必须严格保护
CodeIgniter 的数据库连接信息位于 application/config/database.php,其中的 $db['default']['password'] 字段是明文填写的。这不是漏洞,而是设计使然——只要满足以下三点,风险极低:
- 确保
application/目录不在 Web 根目录可访问范围内(例如 Apache 中 DocumentRoot 应指向public/或index.php所在目录) - 禁止 Web 服务器直接解析或输出 PHP 配置文件(通过
.htaccess或 Nginx 的 location 规则限制) - 生产环境关闭
$db['default']['db_debug'] = FALSE,避免错误泄露配置路径或内容
敏感业务数据才需要加密存储到数据库
如果你要存用户手机号、邮箱、证件号等,必须用 CodeIgniter 内置的 Encryption 类加密后再入库:
- CI 3.x:加载
$this->load->library('encryption'),调用$this->encryption->encrypt($plain);解密用$this->encryption->decrypt($cipher) - CI 4.x:使用
service('encrypter')->encrypt($data)和service('encrypter')->decrypt($data) - 密钥
$config['encryption_key']必须是 32 字节真实随机二进制值,不能写字符串如'my-key-123';推荐用bin2hex(openssl_random_pseudo_bytes(32))生成后转为二进制存入配置 - 数据库字段类型需设为
TEXT或VARBINARY,因为加密后数据会膨胀且含不可见字符
避免常见密钥陷阱
很多“加密后解密为空”的问题,根源都在密钥配置错误:
- 不要在
config.php里调用$this->encryption->create_key()—— 此时框架尚未启动,会报错 - 不要复用 session 加密密钥或随便拼接字符串当 encryption_key
- 密钥一旦写死就不能改,否则历史加密数据全部失效
- 确认你用的是
Encryption类,不是已废弃的Encrypt类(CI 3.0+ 已移除)
额外加固建议
提升整体安全性,可叠加以下措施:
- 数据库账号最小权限原则:只授予应用所需表的
SELECT/INSERT/UPDATE权限,禁用DROP/CREATE/FILE等高危权限 - 使用环境变量管理生产密钥(CI 4 支持
.env,CI 3 可借助第三方库或自定义加载逻辑) - 启用会话加密:
$config['sess_encrypt_cookie'] = TRUE,并配好encryption_key,防止会话 Cookie 被篡改 - 所有涉及敏感操作的接口强制 HTTPS,设置
sess_secure_cookie = TRUE











