Node.js:解密加密对称密钥时出现Invalid RSAES-OAEP padding错误
解决「Invalid RSAES-OAEP padding」错误的方案
嘿,我之前也踩过这个坑!你遇到的这个填充错误,根源是Node.js原生Buffer和node-forge的二进制数据格式不兼容导致的,咱们一步步来解决:
问题原因
你用_crypto.randomBytes(32)生成的对称密钥是Node.js的Buffer对象,但node-forge的RSA加密方法默认只认自己的ByteBuffer或者二进制字符串。直接把Buffer传进去的话,forge会错误地按照UTF-8编码去解析字节,把原始的对称密钥给破坏了,解密时自然过不了OAEP的填充校验,就抛出这个错误了。
修正后的完整代码
我们只需要把Buffer转换成forge能正确识别的格式就行,这里提供两种常用方式:
var forge = require('node-forge'); var _crypto = require('crypto'); var rsa = forge.pki.rsa; // 生成32字节的对称密钥(Node.js Buffer) var masterKey = _crypto.randomBytes(32); // 生成2048位RSA密钥对 var keypair = rsa.generateKeyPair(2048); // --- 关键转换步骤:把Buffer转成forge兼容的格式 --- // 方式1:转成二进制字符串(推荐) var masterKeyBinary = masterKey.toString('binary'); // 方式2:用forge的Buffer包装 // var masterKeyForgeBuffer = forge.util.createBuffer(masterKey, 'raw'); // 用RSA-OAEP加密对称密钥 var encryptedVal = keypair.publicKey.encrypt(masterKeyBinary, 'RSA-OAEP'); // 解密测试 var decryptedVal = keypair.privateKey.decrypt(encryptedVal, 'RSA-OAEP'); // 把解密后的二进制字符串转回Node.js Buffer var decryptedMasterKey = Buffer.from(decryptedVal, 'binary'); // 验证密钥是否一致(应该输出true) console.log(Buffer.compare(masterKey, decryptedMasterKey) === 0);
额外注意事项
- 如果需要用SHA-256(而非默认的SHA-1)作为OAEP的哈希函数,加密和解密时要统一指定,不然也会触发填充错误:
// 加密时指定SHA-256 var encryptedVal = keypair.publicKey.encrypt(masterKeyBinary, 'RSA-OAEP', { md: forge.md.sha256.create() }); // 解密时也要对应指定 var decryptedVal = keypair.privateKey.decrypt(encryptedVal, 'RSA-OAEP', { md: forge.md.sha256.create() }); - 确保加密和解密使用的密钥对是同一组,别搞混了公钥和私钥的用途。
内容的提问来源于stack exchange,提问作者Neetu Soni
相关产品推荐
相关产品推荐

