Node.js Crypto:如何重新加密AES加密的RSA私钥
解决AES加密RSA私钥重新加密时的密钥长度错误问题
错误原因
你直接将密码作为AES密钥传入createDecipheriv,但AES-256要求密钥长度为32字节,而你的密码长度大概率不满足这个要求,因此触发Invalid key length错误。此外,Node.js生成加密PKCS1私钥时,并非直接使用密码作为AES密钥,而是通过OpenSSL的EVP_BytesToKey密钥派生函数从密码生成密钥和IV,手动解析PEM并处理加密/解密的过程很容易出错。
正确解决方案:使用Node.js内置API处理
无需手动解析PEM结构,直接用Node.js crypto模块的密钥加载和导出API即可完成解密+重新加密的操作,代码简洁且符合标准:
const crypto = require('crypto'); const reEncryptRsaPrivateKey = (encryptedPrivateKeyPem, oldPassphrase, newPassphrase) => { // 加载加密私钥,用旧密码解密得到明文密钥对象 const privateKey = crypto.createPrivateKey({ key: encryptedPrivateKeyPem, passphrase: oldPassphrase, format: 'pem', type: 'pkcs1' }); // 导出时用新密码重新加密,生成符合要求的PKCS1格式私钥 const reEncryptedPem = privateKey.export({ format: 'pem', type: 'pkcs1', cipher: 'aes-256-cbc', passphrase: newPassphrase }); return reEncryptedPem.toString(); }
代码说明
crypto.createPrivateKey会自动解析加密的PEM私钥,处理密钥派生、解密的全部流程,无需手动提取IV或处理KDF逻辑。export方法支持直接指定新的密码和加密算法,生成的私钥格式与你最初用crypto.generateKeyPairSync生成的完全一致。
手动实现的问题(可选了解)
如果一定要手动解析PEM并处理加密,需要严格复现EVP_BytesToKey的逻辑(默认使用MD5哈希、1次迭代、8字节盐),但这个过程容易出错,且内置API已经封装了所有细节,不建议手动实现。
内容的提问来源于stack exchange,提问作者MANAMANA
相关产品推荐
相关产品推荐

