如何在XAMPP环境下实现数据库表级加密
XAMPP环境下phpMyAdmin已建数据表加密实操方案
首先明确两类加密的适用场景,别上来就乱改配置做无效加密:
- 字段级加密:针对密码、手机号、身份证这类业务敏感数据,就算数据库被非授权查询,也看不到明文,是网站开发最常用的加密方式
- 整表透明加密:针对数据库物理文件,就算有人直接拷走服务器上的表存储文件,没有密钥也读不出内容,不影响正常业务读写
一、字段级加密(优先做,适配绝大多数网站开发需求)
XAMPP默认集成MariaDB+PHP环境,不用额外装扩展就能实现:
- 密码类字段(不需要还原明文)
绝对不要用MD5、SHA1这类已被碰撞破解的算法,也不要用可反向解密的加密方式存密码。
最省事的方案是直接用PHP内置函数处理,不用在SQL层写加密逻辑,避免明文出现在数据库日志里:- 先在phpMyAdmin里打开对应表的结构页,把存密码的字段类型改成
varchar(255),点保存就行,不用删已有数据(后续更新密码的时候自动替换成密文) - 注册/改密码的业务逻辑里,用
password_hash()生成哈希值直接存库:
// 传入用户输入的明文密码,自动生成带随机盐的bcrypt哈希值 $storePwd = password_hash($inputPwd, PASSWORD_DEFAULT); // 直接把$storePwd插入/更新到数据表对应字段就行- 登录验证的时候用
password_verify()做比对,不需要自己处理盐逻辑:
// 从数据库查出来之前存的哈希密码,和用户本次输入的明文密码比对 if (password_verify($inputPwd, $dbPwdHash)) { // 验证通过,执行登录逻辑 } - 先在phpMyAdmin里打开对应表的结构页,把存密码的字段类型改成
- 可还原敏感字段(手机号、身份证、收货地址这类需要读明文的内容)
不要用数据库自带的AES_ENCRYPT()函数,密钥写在SQL里很容易被日志、慢查询记录泄露,直接在PHP层用OpenSSL扩展做加解密(XAMPP默认开启这个扩展):- 先在phpMyAdmin里把对应存敏感内容的字段类型改成
TEXT,避免加密后内容过长截断 - 提前生成一个32位随机字符串作为加密密钥,存到web根目录之外的配置文件里,别硬写在业务代码里,也别提交到代码仓库
- 业务里直接调用加解密函数处理数据:
// 提前加载配置里的密钥,比如$encKey = 从配置文件读出来的32位随机串 function aesEncrypt($plainText, $key) { $ivLen = openssl_cipher_iv_length('AES-256-CBC'); $iv = openssl_random_pseudo_bytes($ivLen); $cipherRaw = openssl_encrypt($plainText, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); return base64_encode($iv . $cipherRaw); } function aesDecrypt($cipherText, $key) { $cipherRaw = base64_decode($cipherText); $ivLen = openssl_cipher_iv_length('AES-256-CBC'); $iv = substr($cipherRaw, 0, $ivLen); $cipher = substr($cipherRaw, $ivLen); return openssl_decrypt($cipher, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); } // 存数据的时候先加密再写库,读数据的时候解密之后再用 - 先在phpMyAdmin里把对应存敏感内容的字段类型改成
二、整表透明加密(防物理文件泄露,不需要改业务代码)
如果需要防止服务器硬盘被拷走、mysql目录下的表文件被直接窃取的情况,可以开InnoDB透明加密,正常的数据库连接读写完全不受影响:
- 打开XAMPP控制面板,先停掉MySQL服务,点MySQL行的「Config」按钮,打开
my.ini配置文件 - 在
[mysqld]配置段下追加以下内容:
plugin_load_add = file_key_management file_key_management_filekey = FILE:/xampp/mysql/keyfile.key file_key_management_encryption_algorithm = AES_CTR innodb_encrypt_tables = ON innodb_encrypt_log = ON innodb_encryption_threads = 4
- 生成密钥文件放到上面配置指定的路径,启动MySQL服务
- 打开phpMyAdmin的SQL执行窗口,对需要加密的表执行语句:
ALTER TABLE 你自己的表名 ENCRYPTION='Y';
等语句执行完成,这个表对应的物理存储文件就已经是加密状态了。
注意事项:
- 所有涉及表结构修改、加密配置调整的操作,先在phpMyAdmin里导出对应表做备份,避免操作失误丢数据
- 加密密钥一定不要存在web可直接访问的目录下,防止被下载泄露
- 密码字段必须用单向哈希,不要为了所谓的“方便管理”用可解密的方式存密码
内容的提问来源于stack exchange,提问作者Farjana
相关产品推荐
相关产品推荐

