求NodeJS与Postgres输出一致的加密算法(Node加密Postgres解密)
实现NodeJS与PostgreSQL兼容的AES加密解密方案
选择AES-256-CBC算法即可满足需求,两边原生都支持该算法,只要保证加密解密的参数(密钥、IV、填充方式、编码)完全一致,就能得到匹配的结果。
NodeJS 端加密代码
用NodeJS内置的crypto模块实现加密,注意保存加密时生成的IV(初始向量),解密时必须用到:
const crypto = require('crypto'); // 两边必须共用的配置参数 const ALGORITHM = 'aes-256-cbc'; const SECRET_KEY = Buffer.from('你的32位密钥字符串', 'utf8'); // AES-256要求密钥长度为32字节 function encrypt(text) { // 生成16位随机IV(AES-CBC的IV长度必须等于块大小,AES块大小为16字节) const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv(ALGORITHM, SECRET_KEY, iv); let encrypted = cipher.update(text, 'utf8', 'base64'); encrypted += cipher.final('base64'); // 返回IV和密文的组合(用冒号分隔,方便后续拆分) return `${iv.toString('base64')}:${encrypted}`; } // 示例调用 const originalText = '需要加密的目标文本'; const encryptedText = encrypt(originalText); console.log('加密结果:', encryptedText);
PostgreSQL 端解密语句
先从加密字符串中拆分出IV和密文,再用PostgreSQL的pgcrypto扩展提供的函数解密:
- 先启用
pgcrypto扩展(只需执行一次):
CREATE EXTENSION IF NOT EXISTS pgcrypto;
- 解密查询语句(假设加密后的数据存在
encrypted_data字段):
SELECT pgp_sym_decrypt( decode(split_part(encrypted_data, ':', 2), 'base64'), '你的32位密钥字符串', 'cipher-algo=aes256,iv=' || decode(split_part(encrypted_data, ':', 1), 'base64') ) AS decrypted_text FROM your_table WHERE id = 1; -- 替换为你的实际查询条件
核心注意事项
- 密钥必须是32位字符串(对应AES-256),两边必须完全一致,且要妥善保管,绝对不能泄露。
- IV必须是16位随机值,每次加密都要生成新的,不能固定使用同一IV,否则会大幅降低加密安全性。
- 编码格式要统一:NodeJS用base64输出加密结果,PostgreSQL用
decode函数解析base64为字节流。 - 填充方式默认采用PKCS#7,两边原生兼容,无需额外配置。
内容的提问来源于stack exchange,提问作者Shailesh Kumar
相关产品推荐
相关产品推荐

