用JavaScript实现PBEWithHmacSHA256AndAES_256加密功能
JavaScript实现PBEWithHmacSHA256AndAES_256(兼容Mulesoft校验)
PBEWithHmacSHA256AndAES_256是Java标准加密套件,核心流程是通过PBKDF2算法、以HMAC-SHA256为伪随机函数,从密码和盐值派生48字节密钥材料,拆分后前32字节作为AES-256加密密钥,后16字节作为CBC模式初始化向量IV,最终用AES-256/CBC/PKCS5Padding完成加密。你之前参考的PBKDF1+DES实现逻辑和该算法标准不匹配,直接替换哈希算法无法得到正确结果。
前置依赖
- 使用CryptoJS库完成加密逻辑实现,需引入core、pbkdf2、hmac-sha256、aes、mode-cbc、pad-pkcs7模块。
完整实现代码
// Node环境用require引入,浏览器环境直接引用对应script文件即可 const CryptoJS = require('crypto-js'); /** * PBEWithHmacSHA256AndAES_256加密,和Mulesoft Java侧逻辑对齐 * @param {string} plaintext 待加密明文 * @param {string} password 加密密码 * @param {string} saltHex 16进制格式盐值 * @param {number} iterations 密钥派生迭代次数 * @returns {string} 16进制格式密文 */ function pbeHmacSha256Aes256Encrypt(plaintext, password, saltHex, iterations) { // 解析密码、盐值为CryptoJS内部WordArray格式 const passwordWA = CryptoJS.enc.Utf8.parse(password); const saltWA = CryptoJS.enc.Hex.parse(saltHex); // PBKDF2派生总长度48字节的密钥材料:32字节AES密钥 + 16字节IV const derivedKey = CryptoJS.PBKDF2(passwordWA, saltWA, { keySize: 48 / 4, // CryptoJS keySize单位为32位字,48字节对应12个字 iterations: iterations, hasher: CryptoJS.algo.SHA256 }); // 拆分密钥和IV const aesKey = CryptoJS.lib.WordArray.create(derivedKey.words.slice(0, 8)); // 前8字=32字节,AES-256密钥 const iv = CryptoJS.lib.WordArray.create(derivedKey.words.slice(8, 12)); // 后4字=16字节,CBC模式IV // AES-CBC模式加密,PKCS7填充 const encryptedRes = CryptoJS.AES.encrypt(plaintext, aesKey, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encryptedRes.ciphertext.toString(CryptoJS.enc.Hex); } // 调用示例,参数请替换为Mule端实际配置 const encryptResult = pbeHmacSha256Aes256Encrypt( "test", "your_actual_password", "2121F055C39F5A751234567890ABCDEF", // 盐长度不低于16字节 1000 // 替换为Mule端实际配置的迭代次数,常见值为1000、65536 ); console.log("加密结果(HEX):", encryptResult);
对齐校验注意事项
- 所有配置参数必须和Mulesoft端完全一致:包括盐值、迭代次数、密文输出格式(HEX/Base64)、明文编码,任意参数偏差都会导致哈希校验失败。如果服务端要求Base64格式密文,直接返回
encryptedRes.toString()即可。 - CryptoJS的PKCS7填充和Java侧的PKCS5Padding在AES块大小固定为16字节时完全兼容,不需要额外做填充转换。
- 解密逻辑和加密流程一致:按相同参数派生出aesKey和iv后,调用
CryptoJS.AES.decrypt传入密文即可完成解密。
内容的提问来源于stack exchange,提问作者Esteban
相关产品推荐
相关产品推荐

