Node.js で @bluecrypt/keypairs と node-forge を使って RSA 暗号化( + node-rsa の使い方)
はじめに
Node.js で node-rsa
の代わりに、@bluecrypt/keypairs
と node-forge
を使って鍵の生成や 暗号化/復号化 を行う方法を整理した。
なお node-rsa
を使わない理由は単純に処理速度の観点から。
TL;DR
node-rsa
以外の RSA 暗号化関連ライブラリについて整理- 鍵生成は
@bluecrypt/keypairs
が速い(※) - 暗号化/復号化 などは
node-forge
が速い(※) - 記事が長くなったので、計測結果詳細は別途まとめる(と思う)
※あくまで「自分の計測した範囲では」なので、環境や状況で結果は異なると思う。
目次
環境・条件
1 | $ sw_vers |
詳細
node-rsa
まずは node-rsa
の使い方。
鍵の生成
https://www.npmjs.com/package/node-rsa#creating-empty-key
1 | const nodeRsa = require("node-rsa"); |
暗号化/復号化
https://www.npmjs.com/package/node-rsa#encryptingdecrypting
1 | const target = 'hello'; |
署名/検証
https://www.npmjs.com/package/node-rsa#signingverifying
1 | const target = 'bye'; |
@bluecrypt/keypairs
@bluecrypt/keypairs はブラウザ向けなので、CDN から読み込む。
1 | <script src="https://rootprojects.org/keypairs/bluecrypt-keypairs.min.js"></script> |
なお、あくまで鍵の生成に特化したライブラリなので、暗号化/復号化/署名/検証 はできない。
鍵の生成
1 | let keypair; |
エクスポート
Keypairs.export
で PEM 形式での出力ができる。
公開鍵。jwk
にキーペアの public
を指定。
1 | let publicPem; |
秘密鍵。jwk
にキーペアの private
を指定。
1 | let privatePem; |
node-forge
node-forge で RSA 暗号化。
鍵の生成
1 | const forge = require("node-forge"); |
鍵のエクスポート
pki.privateKeyToPem
や pki.publicKeyToPem
を使う。
1 | const publicPem = pki.publicKeyToPem(keypair.publicKey); |
鍵のインポート
@bluecrypt/keypairs などで生成した鍵をインポートする際は、pki.privateKeyFromPem
や pki.publicKeyFromPem
を使う。
1 | // Keypairs.export などで生成したり、鍵ファイルを読み込んだりする想定 |
暗号化/復号化
1 | const target = 'hello'; |
署名/検証
いったん forge.md.sha1.create
などを噛ませる必要がある。
署名。forge.md.sha1.create()
の後に md.update('対象文字列', 'encoding')
としたものを使う。
1 | const target = 'sign'; |
検証。(当然だが) 署名時に使ったものと同じデータを使う、md.digest().bytes()
と signature
とを引数に渡す。
1 | const md = forge.md.sha1.create(); |
Tips: base64 encode/decode
通信時には、暗号化や署名した結果をさらに base64 エンコードしたり、逆に受信したデータを base64 デコードしたりすることもあると思う。
Node.js はで Buffer.from
を使うことで base64 encode/decode が簡単に実現できる。
1 | const target = 'hello'; |
base64
以外にも ascii
, utf8
, hex
などがある。
まとめ
node-rsa
以外の RSA 暗号化関連ライブラリについて整理- 鍵生成は
@bluecrypt/keypairs
が速い(※) - 暗号化/復号化 などは
node-forge
が速い(※) - 記事が長くなったので、計測結果詳細は別途まとめる(と思う)
参考文献
関連記事
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)
- axios で unable to verify the first certificate の対応方法
- Git で package-lock.json がコンフリクトした時の解決方法
- Vue.js で FontAwesome を使う方法
- Node.js でミリ秒より高解像度の時刻情報取得や計測を行う方法
- Node.js で firebase-admin を使ってサーバからプッシュ通知
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア