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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 14:06:07