You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:32:41