如何使用Node.js crypto模块替代JSEncrypt实现公钥加密
Node.js Crypto 模块RSA加密
no start line报错解决方案 报错核心原因
你遇到的error:0909006C:PEM routines:get_name:no start line错误,根源是传入的公钥格式不符合Node.js crypto模块的解析要求:
- 此前在浏览器端使用JSEncrypt时,你只需要把392字符的裸Base64公钥传入即可,库内部会自动为这串内容拼接PEM格式要求的固定头尾、按64字符宽度拆分行,转成OpenSSL可识别的标准PEM密钥再执行加密
- Node.js的
crypto.publicEncrypt直接对接OpenSSL的PEM解析逻辑,不会自动补全上述PEM结构。无论你直接传裸Base64字符串,还是把字符串转成Buffer传入,解析器都找不到它规定的起始标识行,最终触发上述报错。
正确实现逻辑
不需要手动修改原有公钥的Base64内容,只需要按标准规则拼接PEM结构、对齐和JSEncrypt一致的加密参数即可,完整可运行代码如下:
const crypto = require('crypto') // 替换为你自己持有的完整392字符裸Base64公钥 const rawPublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAO...' // 自动拼接生成标准PEM格式公钥,无需手动换行 const pemFormattedKey = [ '-----BEGIN PUBLIC KEY-----', ...rawPublicKey.match(/.{1,64}/g), '-----END PUBLIC KEY-----' ].join('\n') // 执行加密,显式指定填充方式和JSEncrypt默认行为对齐 const encryptedResult = crypto.publicEncrypt( { key: pemFormattedKey, padding: crypto.constants.RSA_PKCS1_PADDING }, Buffer.from('111111', 'utf8') ) // 输出Base64格式的密文,和浏览器端JSEncrypt加密结果格式完全一致 console.log(encryptedResult.toString('base64'))
常见踩坑提醒
- 不要错误使用
-----BEGIN RSA PUBLIC KEY-----作为公钥头:你持有的392字符长度的公钥是JSEncrypt默认导出的X.509 SubjectPublicKeyInfo格式,对应的固定公钥头只能是-----BEGIN PUBLIC KEY-----,用错头仍然会触发格式识别错误。 - 不要省略填充参数配置:JSEncrypt默认使用
RSA_PKCS1_PADDING(PKCS#1 v1.5)填充规则,而Node 12+版本的crypto模块默认使用更安全的OAEP填充,不显式指定的话,加密生成的密文将无法被原有的JSEncrypt解密流程正常解析。
内容的提问来源于stack exchange,提问作者Kosteg
相关产品推荐
相关产品推荐

