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

将固定盐Java PBEWithMD5AndDES加解密迁移至Node.js

正确的Node.js迁移实现方案(对应Java PBEWithMD5AndDES加解密)

核心参数匹配

首先明确Java端的核心参数,必须严格对应:

  • 固定盐值:十六进制0x0C9D4AE41E8315FC → 转为Node.js Buffer格式
  • 迭代次数:5次
  • 密钥派生算法:MD5
  • 加密模式:DES-CBC + PKCS5Padding(Java PBEWithMD5AndDES的默认配置)

完整可运行代码

const crypto = require('crypto');

// 固定盐值:十六进制转Buffer
const FIXED_SALT = Buffer.from('0C9D4AE41E8315FC', 'hex');
const ITERATION_COUNT = 5;
const CIPHER_ALG = 'des-cbc';

/**
 * 加密函数
 * @param {string} plaintext 明文(UTF-8编码)
 * @param {string} password 加密密码
 * @returns {string} 密文(Base64编码)
 */
function encrypt(plaintext, password) {
    // 生成8字节DES密钥 + 8字节IV,共16字节(Java PBE的密钥派生逻辑)
    const keyIvBuffer = crypto.pbkdf2Sync(password, FIXED_SALT, ITERATION_COUNT, 16, 'md5');
    const desKey = keyIvBuffer.slice(0, 8);
    const iv = keyIvBuffer.slice(8, 16);

    const cipher = crypto.createCipheriv(CIPHER_ALG, desKey, iv);
    let encrypted = cipher.update(plaintext, 'utf8', 'base64');
    encrypted += cipher.final('base64');
    return encrypted;
}

/**
 * 解密函数
 * @param {string} ciphertext 密文(Base64编码)
 * @param {string} password 解密密码
 * @returns {string} 明文(UTF-8编码)
 */
function decrypt(ciphertext, password) {
    const keyIvBuffer = crypto.pbkdf2Sync(password, FIXED_SALT, ITERATION_COUNT, 16, 'md5');
    const desKey = keyIvBuffer.slice(0, 8);
    const iv = keyIvBuffer.slice(8, 16);

    const decipher = crypto.createDecipheriv(CIPHER_ALG, desKey, iv);
    let decrypted = decipher.update(ciphertext, 'base64', 'utf8');
    decrypted += decipher.final('utf8');
    return decrypted;
}

// 测试验证
const testPwd = 'your-password';
const testText = 'user-info:{"id":1,"name":"admin"}';
const encryptedStr = encrypt(testText, testPwd);
const decryptedStr = decrypt(encryptedStr, testPwd);

console.log('加密结果:', encryptedStr);
console.log('解密结果:', decryptedStr);

关键逻辑说明

  1. 盐值转换:Java中盐是byte[],Node.js通过Buffer.from(hexStr, 'hex')直接实现字节级匹配,避免编码错误。
  2. 密钥派生:Java的SecretKeyFactory.getInstance("PBEWithMD5AndDES")会用MD5迭代生成包含密钥和IV的16字节数据,Node.js用pbkdf2Sync生成相同长度的字节流,拆分出8字节DES密钥和8字节IV。
  3. 加密模式对齐:Java的PBEWithMD5AndDES默认采用CBC模式和PKCS5填充,Node.js的des-cbc算法默认使用PKCS5Padding,无需额外配置。
  4. 编码一致性:示例中使用UTF-8处理明文,Base64处理密文,和Java端常用编码方式保持一致。

常见错误排查

如果你的原有Node.js代码无法运行,大概率是以下问题:

  • 盐值未按十六进制解析(比如直接用字符串作为盐,而非Buffer)
  • 迭代次数设置错误(必须为5次)
  • 加密模式错误(比如误用ECB模式,或未指定IV)
  • 密钥/IV长度错误(DES密钥和IV必须都是8字节)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:55:27