将固定盐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);
关键逻辑说明
- 盐值转换:Java中盐是
byte[],Node.js通过Buffer.from(hexStr, 'hex')直接实现字节级匹配,避免编码错误。 - 密钥派生:Java的
SecretKeyFactory.getInstance("PBEWithMD5AndDES")会用MD5迭代生成包含密钥和IV的16字节数据,Node.js用pbkdf2Sync生成相同长度的字节流,拆分出8字节DES密钥和8字节IV。 - 加密模式对齐:Java的
PBEWithMD5AndDES默认采用CBC模式和PKCS5填充,Node.js的des-cbc算法默认使用PKCS5Padding,无需额外配置。 - 编码一致性:示例中使用UTF-8处理明文,Base64处理密文,和Java端常用编码方式保持一致。
常见错误排查
如果你的原有Node.js代码无法运行,大概率是以下问题:
- 盐值未按十六进制解析(比如直接用字符串作为盐,而非Buffer)
- 迭代次数设置错误(必须为5次)
- 加密模式错误(比如误用ECB模式,或未指定IV)
- 密钥/IV长度错误(DES密钥和IV必须都是8字节)
内容的提问来源于stack exchange,提问作者user20871694
相关产品推荐
相关产品推荐

