PHP创建数据库本身不支持加密,所谓“建库加密”实为数据存储层或字段级加密;MySQL表级加密需服务端配置且PHP不参与;PHP层应采用sodium_crypto_secretbox()等对敏感字段加密,并严格管理密钥与处理二进制数据。

PHP 创建数据库本身不支持加密
PHP 的 mysqli 或 PDO 扩展执行 CREATE DATABASE 语句时,只是向 MySQL/MariaDB 发送指令,而 MySQL 本身不提供「加密数据库」这种抽象概念——它没有“创建一个默认全加密的库”的语法。所谓“建库加密”,实际是指后续对**数据存储层**或**字段内容**做加密处理。
MySQL 表级加密(Data-at-Rest Encryption)需服务端配置
MySQL 5.7+ 支持 InnoDB 表空间加密,但这是服务端功能,和 PHP 无关:
- 必须启用
innodb_encrypt_tables=ON等参数,并配置密钥环插件(如keyring_file) - 建表时加
ENCRYPTION='Y',例如:CREATE TABLE users (id INT) ENCRYPTION='Y';
- PHP 不参与密钥管理,也看不到加密过程;一旦服务端未启用,该选项会被静默忽略
- 注意:这仅加密磁盘文件,内存中、网络传输中、SQL 日志里仍是明文
PHP 层字段级加密才是可控且常用的做法
在 PHP 写入前对敏感字段(如身份证、手机号、token)加密,读取后解密。关键点:
- 用
sodium_crypto_secretbox()(推荐)或openssl_encrypt(),避免已废弃的mcrypt - 必须安全生成并保管密钥:不要硬编码,建议从环境变量或密钥管理服务加载
- 加密后结果是二进制,存入数据库需转为 Base64 或十六进制(如用
bin2hex()),对应字段类型设为VARCHAR或TEXT - 示例片段:
$key = sodium_hex2bin($_ENV['ENCRYPTION_KEY']); // 32 字节 hex key $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); $ciphertext = sodium_crypto_secretbox($plain, $nonce, $key); $stored = bin2hex($nonce . $ciphertext); // 拼接 nonce + 密文
- 解密时先分离
$nonce(前 24 字节),再调用sodium_crypto_secretbox_open()
别混淆「密码哈希」和「数据加密」
用户密码必须用 password_hash() 哈希(不可逆),不是加密;而银行卡号、地址等需要可逆操作的字段才用加密。混用会导致无法还原数据或严重安全漏洞。
ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有
立即学习“PHP免费学习笔记(深入)”;
真正难的不是写几行加密代码,而是密钥生命周期管理、加密字段的查询限制(比如无法用 WHERE phone = ? 直接查加密值)、以及是否遗漏了日志/缓存/备份中的明文残留。










