如何用JavaScript实现AES-128-CBC加密?及OpenSSL脚本转Postman JS
在JavaScript(Postman)中实现OpenSSL风格的AES-128-CBC加密
我来帮你把这段Shell的加密逻辑转换成Postman可用的JavaScript代码,先拆解下原脚本的核心流程,确保实现完全对齐:
- 以
API_KEY作为HMAC密钥,DATE为输入生成SHA256格式的HMAC摘要(十六进制输出) - 从摘要里截取前32个十六进制字符作为AES的IV(对应16字节,符合AES-128-CBC的IV长度要求)
- 截取摘要中接下来的32个十六进制字符作为AES密钥(对应16字节,正好是AES-128的密钥长度)
- 用上述密钥和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
相关产品推荐
相关产品推荐

