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

如何用JavaScript实现AES-128-CBC加密?及OpenSSL脚本转Postman JS

在JavaScript(Postman)中实现OpenSSL风格的AES-128-CBC加密

我来帮你把这段Shell的加密逻辑转换成Postman可用的JavaScript代码,先拆解下原脚本的核心流程,确保实现完全对齐:

  1. 以API_KEY作为HMAC密钥,DATE为输入生成SHA256格式的HMAC摘要(十六进制输出)
  2. 从摘要里截取前32个十六进制字符作为AES的IV(对应16字节,符合AES-128-CBC的IV长度要求)
  3. 截取摘要中接下来的32个十六进制字符作为AES密钥(对应16字节,正好是AES-128的密钥长度)
  4. 用上述密钥和IV加密private_key,输出Base64格式,且不使用盐(对应OpenSSL的-nosalt参数)

Postman内置了CryptoJS库,我们直接用它来实现,以下是完整代码:

// 对应原Shell脚本的参数
const API_KEY = "qrBprgc/3dTjrrD@4t!9FcNjwT3_Ra";
const DATE = "Mon, 19 Mar 2018 12:45:05 EET";
const private_key = "test";

// Step 1: 生成HMAC-SHA256摘要,转为十六进制字符串
const hmacDigest = CryptoJS.HmacSHA256(DATE, API_KEY).toString(CryptoJS.enc.Hex);

// Step 2: 截取IV和密钥(32个十六进制字符=16字节,匹配AES-128的要求)
const aes128cbcivHex = hmacDigest.substring(0, 32);
const aes128cbckeyHex = hmacDigest.substring(32, 64);

// 将十六进制字符串转为CryptoJS需要的WordArray格式
const iv = CryptoJS.enc.Hex.parse(aes128cbcivHex);
const key = CryptoJS.enc.Hex.parse(aes128cbckeyHex);

// Step 3: 执行AES-128-CBC加密,对齐OpenSSL默认配置
const encrypted = CryptoJS.AES.encrypt(
  private_key,
  key,
  {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7, // OpenSSL默认使用Pkcs7填充
    noSalt: true // 对应OpenSSL的-nosalt参数,避免自动生成盐导致结果不一致
  }
);

// 输出和Shell脚本一致的Base64格式加密结果
const encrypted_private_key = encrypted.toString();
console.log(encrypted_private_key);

关键细节说明:

  • 格式转换:CryptoJS的加密方法要求密钥和IV为WordArray类型,必须用CryptoJS.enc.Hex.parse()把十六进制字符串转成对应格式
  • 填充对齐:OpenSSL的aes-128-cbc默认使用Pkcs7填充,虽然CryptoJS默认也是这个,但显式声明更稳妥
  • 无盐设置:一定要加noSalt: true,否则CryptoJS会自动生成盐,导致加密结果和Shell脚本完全不同
  • 字符串处理:Shell里的echo -n "$DATE"确保没有额外换行,JavaScript直接用DATE字符串即可;echo -e $private_key如果没有特殊转义字符,等价于直接输出原字符串,所以直接用变量就行

你可以把这段代码放到Postman的预请求脚本或测试脚本中运行,输出结果会和你Shell脚本的encrypted_private_key完全一致。

内容的提问来源于stack exchange,提问作者Andrey Nazarov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:16:34