概念
在传输敏感数据(如用户信用卡号、密码)时,仅仅使用 HTTPS 有时是不够的(如防止中间代理记录日志)。通常应用层也会进行加密。
流程:明文 -> AES 加密 (得到二进制密文) -> Base64 编码 (得到字符串) -> 通过 JSON API 发送
Node.js 实现
const crypto = require('crypto');
// 配置
const ALGORITHM = 'aes-256-cbc';
const KEY = crypto.randomBytes(32); // 真实场景中应该从环境变量读取
const IV = crypto.randomBytes(16);
function encrypt(text) {
let cipher = crypto.createCipheriv(ALGORITHM, Buffer.from(KEY), IV);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
// 关键点:将二进制密文 + IV 转换为 Base64
return {
iv: IV.toString('base64'),
content: encrypted.toString('base64')
};
}
function decrypt(text) {
// 1. Base64 解码提取 IV 和 密文
let iv = Buffer.from(text.iv, 'base64');
let encryptedText = Buffer.from(text.content, 'base64');
// 2. 解密
let decipher = crypto.createDecipheriv(ALGORITHM, Buffer.from(KEY), iv);
let decrypted = decipher.update(encryptedText);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
}
// 使用
const secret = "My Super Secret Data";
const encryptedPacket = encrypt(secret);
console.log("Encrypted:", encryptedPacket);
// 结果: { iv: "...", content: "..." }
const restored = decrypt(encryptedPacket);
console.log("Restored:", restored);