如何用PHP 8.1解密Rails 7加密的MySQL 8中Author模型的address字段?
用PHP 8.1解密Rails 7 Active Record加密的字段
完全可行,Rails 7的Active Record加密基于标准AES-GCM算法,只要持有正确的密钥信息,就能用PHP的openssl扩展完成解密。以下是具体实现步骤及代码示例:
核心前提
- 已获取Rails credentials中
active_record_encryption的primary_key(Base64编码格式) - 数据库中存储的加密字段为Rails默认格式:
[Base64编码的IV]:[Base64编码的密文]:[Base64编码的认证标签]
实现步骤
- 从数据库读取加密的
address字段值 - 拆分字符串为IV、密文、认证标签三部分,分别进行Base64解码
- 将Rails的
primary_key从Base64解码为原始二进制密钥 - 使用PHP的
openssl_decrypt函数执行AES-GCM解密
代码示例
<?php // 数据库连接配置 $mysqli = new mysqli('localhost', 'db_user', 'db_pass', 'db_name'); if ($mysqli->connect_error) { die('数据库连接失败: ' . $mysqli->connect_error); } // 读取指定作者的加密address字段 $authorId = 1; $query = "SELECT address FROM authors WHERE id = ?"; $stmt = $mysqli->prepare($query); $stmt->bind_param('i', $authorId); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $encryptedAddress = $row['address']; // 拆分并解码加密内容 list($ivB64, $ciphertextB64, $tagB64) = explode(':', $encryptedAddress); $iv = base64_decode($ivB64); $ciphertext = base64_decode($ciphertextB64); $tag = base64_decode($tagB64); // 处理Rails加密密钥 $railsPrimaryKey = '替换为你的active_record_encryption.primary_key值'; $decodedKey = base64_decode($railsPrimaryKey); // 执行解密 $decryptedAddress = openssl_decrypt( $ciphertext, 'aes-256-gcm', $decodedKey, OPENSSL_RAW_DATA, $iv, $tag ); if ($decryptedAddress === false) { die('解密失败: ' . openssl_error_string()); } // 输出结果 echo '解密后的地址:' . $decryptedAddress; // 清理资源 $stmt->close(); $mysqli->close(); ?>
注意事项
- 确保PHP已启用openssl扩展(PHP 8.1默认启用)
- 解码后的
primary_key必须为32字节(AES-256要求),否则说明密钥获取或解码错误 - Rails默认生成的IV为12字节、认证标签为16字节,若解码后长度不符,需检查字段拆分逻辑
- 若Rails配置了自定义加密格式,需对应调整拆分规则
内容的提问来源于stack exchange,提问作者EastsideDev
相关产品推荐
相关产品推荐

