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

求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扩展提供的函数解密:

  1. 先启用pgcrypto扩展(只需执行一次):
CREATE EXTENSION IF NOT EXISTS pgcrypto;
  1. 解密查询语句(假设加密后的数据存在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:33:13