
本文介绍如何读取含“名称-&&-密文”格式的文本文件,用 openssl_decrypt() 逐行解密密文,并安全输出原始密码,涵盖数据解析、Base64 解码、AES 解密全流程及关键注意事项。
本文介绍如何读取含“名称-&&-密文”格式的文本文件,用 `openssl_decrypt()` 逐行解密密文,并安全输出原始密码,涵盖数据解析、base64 解码、aes 解密全流程及关键注意事项。
在实际开发中,若你已使用对称加密(如 AES-128-CBC 或 AES-256-GCM)对密码进行了加密存储(注意:绝非哈希),则可借助 PHP 的 openssl_decrypt() 进行逆向解密。需强调:openssl_decrypt() 仅适用于加密(encryption)结果,不适用于哈希(hashing)——哈希是单向不可逆的,无法“解密”,这一点在设计密码存储方案时必须严格区分。
以下是一个完整、健壮的解密脚本示例,假设你使用的是 AES-128-CBC 加密,密钥($key)和初始化向量($iv)已知且与加密时完全一致:
<?php // ⚠️ 重要:请确保 $key 和 $iv 与加密时严格一致
$key = 'your-32-byte-secret-key-1234567890'; // 示例:AES-256 需 32 字节
$iv = '0123456789abcdef'; // 16 字节 IV(AES-CBC 要求)
$data = <<<EOT
instagram-&&-aHJK7y9894ds==
facebook-&&-dKBHJ&^(8*==
somesite-&&-djahJHl*(&==
EOT;
$lines = explode(PHP_EOL, trim($data));
foreach ($lines as $line) {
if (empty($line)) continue;
$parts = explode('-&&-', $line, 2); // 限制分割为最多 2 部分,防误切密文中的分隔符
if (count($parts) !== 2) {
echo "⚠️ 跳过格式错误行: {$line}\n";
continue;
}
[$site, $encodedCipher] = $parts;
// Step 1: Base64 解码(密文通常经 Base64 编码后存储)
$cipherText = base64_decode($encodedCipher);
if ($cipherText === false) {
echo "❌ {$site}: Base64 解码失败,请检查密文格式\n";
continue;
}
// Step 2: 执行 OpenSSL 解密(以 AES-128-CBC 为例)
$decrypted = openssl_decrypt(
$cipherText,
'AES-128-CBC', // 加密算法(需与加密端一致)
$key,
OPENSSL_RAW_DATA,
$iv
);
if ($decrypted === false) {
$error = openssl_error_string();
echo "❌ {$site}: 解密失败 — {$error}\n";
continue;
}
echo "✅ {$site}: {$decrypted}\n";
}
?>
? 关键注意事项:
-
算法与参数必须匹配:
openssl_decrypt()的$method(如'AES-256-GCM')、$key长度、$iv长度及是否启用OPENSSL_ZERO_PADDING等,必须与加密时完全一致,否则解密必然失败。 -
密文需先 Base64 解码:示例中密文末尾含
==,表明其为 Base64 编码字符串,必须先base64_decode()得到原始二进制密文,再传入openssl_decrypt()。 -
安全性提醒:生产环境切勿明文存储或直接输出密码;本例仅为技术演示。真实场景应使用
password_hash()/password_verify()处理用户密码,加密仅用于敏感配置等必要场景,且密钥须通过环境变量或密钥管理服务注入。 -
错误处理不可省略:
openssl_decrypt()失败时返回false,务必检查并记录错误(可用openssl_error_string()辅助调试)。
运行上述脚本后,你将看到每行站点名及其对应解密后的明文密码(前提是密钥、IV 和加密参数完全正确)。掌握此流程,即可安全、高效地批量还原对称加密数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











