JS中实现私钥导出公钥

有需求前端实现基于私钥导出公钥,调研了几个方案,最终解决,这里总结下。

解决办法

使用node-forge,该库支持浏览器端/Node服务端,因此前端可用。

如下贴出Node下如何使用

1
2
3
4
5
6
7
8
9
const forge = require('node-forge');// 浏览器端,更换为import或者直接script导入JS模块即可

const privateKeyPem = fs.readFileSync(`${__dirname}/client1.key`, {
encoding: 'utf8'
}); // client1为pem格式私钥文件

const forgePriKey = forge.pki.privateKeyFromPem(privateKeyPem);
const forgePubKey = forge.pki.setRsaPublicKey(forgePriKey.n, forgePriKey.e);
const publicKeyPem = forge.pki.publicKeyToPem(forgePubKey);

其它几个加密方式

  1. 前端原生提供crypto,但当前功能较弱,无法解决
  2. 社区常用加密库jsrsasign当前不支持基于私钥导出公钥
  3. Node Crypto模块下支持crypto.createPublicKey(key),但只能在服务端使用
  4. 命令行工具openssl支持openssl pkey -in ./client1.key -pubout,但只能在服务端使用

综上,如果必须前端实现,那就需要使用node-forge,如果可以借助服务端实现,那么如上几种方案都可行。

写在最后

个人认为前端加密这块过去比较弱的原因有两点,1是场景弱,Web所在意的更多是交互,而非安全性;2是加密解密性能开销较大。但随着现在Web的发展,各种应用场景层出不穷,且硬件也在提高,性能开销已不是问题。所以前端加密需求也就出现的越来越多了,因此前端加密也就排上日程了,比如crypto模块的出现。