如何在Node.js中实现与Java一致的AES-256-GCM加密(PBKDF2WithHmacSHA256)
问题原因
- 多余字段拼接:Java代码中盐值(SALT)和初始向量(IV)均为硬编码固定值,加密完成后仅返回密文和GCM认证标签的拼接结果,现有Node.js代码额外拼接了不需要输出的盐值、IV字段,导致输出结果长度和内容均不匹配。
- 拼接顺序错误:AES-GCM模式下Java的
Cipher.doFinal()返回内容的顺序为密文在前、128位认证标签在后,现有Node.js代码采用「标签在前、密文在后」的顺序,二者逻辑不一致。
修改后的完整Node.js代码
const crypto = require('crypto'); const salt = "thisIsSalt"; const digest = 'sha256'; const aesSecretKey = "SecKeyTest"; module.exports = { encrypt: function (plainText){ // 密钥派生逻辑和Java完全对齐 const key = crypto.pbkdf2Sync(aesSecretKey, salt, 65536, 32, digest); const iv = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]); // 初始化AES-256-GCM加密器 const cipher = crypto.createCipheriv('aes-256-gcm', key, iv); // 执行加密 const encrypted = Buffer.concat([cipher.update(plainText, 'utf8'), cipher.final()]); // 获取128位GCM认证标签 const tag = cipher.getAuthTag(); // 仅拼接密文+认证标签,顺序和Java保持一致后转Base64 return Buffer.concat([encrypted, tag]).toString('base64'); } };
验证说明
输入明文hello时,修改后的代码输出结果为rgCx2SDSqio15M+0lViNAzW/lUmz,和Java侧输出完全一致。
内容的提问来源于stack exchange,提问作者XenonCI
相关产品推荐
相关产品推荐

