PHP 5.6升级至7.3并迁移至MariaDB后,如何解密数据库加密字段?
嘿,我来帮你搞定这个解密导出的问题!先仔细拆解了你的加密函数逻辑,给你准备了现成的代码和步骤,直接就能用。
解密方案分析与实现代码
先拆解你的加密逻辑
你的encode函数核心步骤是这样的:
- 用
md5($encryption_key)生成最终加密密钥 - 用
md5(md5($encryption_key))生成CBC模式的初始向量(IV) - 采用RIJNDAEL_256算法+CBC模式加密原始字符串
- 加密结果经过base64编码后返回
注意:PHP7.3已经移除了mcrypt扩展,所以咱们用PHP官方推荐的openssl扩展来实现解密,完全匹配你的加密逻辑。
解密函数实现
下面是适配PHP7.3+的解密函数,直接对应你的加密流程:
function decode($encryptedString, $encryptionKey) { $key = md5($encryptionKey); $iv = md5(md5($encryptionKey)); // 先解码base64格式的加密内容 $encryptedData = base64_decode($encryptedString); // 使用openssl解密,严格匹配算法、密钥、IV和填充方式 $decrypted = openssl_decrypt( $encryptedData, 'rijndael-256', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv ); // 移除mcrypt默认添加的零填充字符 $decrypted = rtrim($decrypted, "\0"); return $decrypted; }
完整的数据导出脚本
这个脚本可以直接连接你的MariaDB数据库,自动解密指定字段并导出成CSV文件(方便你保存和查看数据),记得替换里面的配置信息:
<?php // 替换成你的数据库配置 $dbHost = 'localhost'; $dbName = '你的数据库名'; $dbUser = '数据库用户名'; $dbPass = '数据库密码'; // 替换成你的加密密钥(就是config里的encryption_key) $encryptionKey = '你的加密密钥'; // 解密函数 function decode($encryptedString, $encryptionKey) { $key = md5($encryptionKey); $iv = md5(md5($encryptionKey)); $encryptedData = base64_decode($encryptedString); $decrypted = openssl_decrypt( $encryptedData, 'rijndael-256', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv ); $decrypted = rtrim($decrypted, "\0"); return $decrypted; } // 连接数据库并导出数据 try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 替换成你的表名和字段名,比如这里假设加密字段是encrypted_field1和encrypted_field2 $stmt = $pdo->query("SELECT id, encrypted_field1, encrypted_field2, 其他字段 FROM 你的表名"); // 设置响应头,让浏览器自动下载CSV文件 header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename=decrypted_data.csv'); $output = fopen('php://output', 'w'); // 写入CSV表头 fputcsv($output, ['ID', '解密后的字段1', '解密后的字段2', '其他字段']); // 循环处理每一行数据,解密后写入CSV while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $decryptedField1 = decode($row['encrypted_field1'], $encryptionKey); $decryptedField2 = decode($row['encrypted_field2'], $encryptionKey); fputcsv($output, [ $row['id'], $decryptedField1, $decryptedField2, $row['其他字段'] ]); } fclose($output); } catch(PDOException $e) { die("出错啦: " . $e->getMessage()); } ?>
注意事项
- 确保你的PHP环境安装了
openssl扩展(PHP7.3默认自带,可通过php -m命令检查) - 替换脚本里所有标注“替换成你的xxx”的内容,比如数据库信息、密钥、表名和字段名
- 如果解密后出现乱码,检查数据库连接的字符集是否为
utf8mb4,确保加密时的字符串是UTF-8编码
内容的提问来源于stack exchange,提问作者manassas77
相关产品推荐
相关产品推荐

