src/crypto_key.ccは実装者の得意言語で書かれているが、これだけC++で書かれており、node-gypを導入しビルドする必要がある。これは、コードの保守性を悪くし、Missekeyの導入を難しくしているように思われる。
可能ならばこの関数をNodeのcryptoなどを利用してTypeScriptで書き直してほしい。
Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.
Cで書かれていいるコードはRSA秘密鍵の生成など
↓
NodeのcryptoではRSA秘密鍵の生成はできなそう
↓
Pure JavaScriptな外部モジュールを使う必要がある(Cライブラリに依存すると結局gypがいるため)
↓
Pure JavaScriptなものはある
https://www.npmjs.com/package/node-rsa
https://www.npmjs.com/package/node-forge
↓
やってみるとけっこう遅い
Generate RSA 2048bit (ミリ秒)
| | Average | Max | Min |
|---|---:|---:|---:|
| 既存 | 220 | 509 | 35 |
| node-rsa | 8,437 | 32,557 | 1,444 |
| node-forge | 6,489 | 16,461 | 746 |
crypto_key.ccをPure JavaScriptで書き直すのは出来なくはないものの…
https://github.com/mei23/misskey/commit/d8171f1e2db9f9d653beb6ec2a1b0dd75db01a80
なので微妙…
crypto_key.ccをwast形式で書き直した場合、node-gypへの依存はなくなりかつ速度もそれなりのものが期待できるが保守性を向上させるといえるかが微妙なところ。
たしかにここをJavaScriptにしたとしても、他にもnode-gypを使っているモジュールはあるので、結局node-gypに依存することになります。
node-gypを完全に排除した依存関係を保とうとするのは難しそう。
例えばAがあるバージョンからnode-gypを使うようになるかもしれないし、Aの代替となるモジュールが見当たらないかもしれないし、A自体がnode-gypを使ってなくてもAが依存するBがnode-gypを使ってるかもしれないし…など
ただまあC言語よりはJavaScriptの方がメンテナンスしやすいので(1つの言語に統一されている方が開発者フレンドリー)、速度面がなんとかなればJavaScriptにするのも良さそうです。
wasmで実装するというのはどうでしょうか
クライアント側で(RSA鍵生成を)実行していいなら、JavaScriptからwindow.cryptあたりを使うだけでよかったりします。Nativeなので速いはず。
https://developer.mozilla.org/ja/docs/Web/API/SubtleCrypto
上で出ているnode-forgeがNode/Browser両対応で、
Browserの場合はNative(SubtleCrypto)とPure JavaScriptのラッパーになってます。
暗号系のライブラリはあまり変えないほうがよい気がしますね(セキュリティ上の問題などもあるので)
Most helpful comment
Cで書かれていいるコードはRSA秘密鍵の生成など
↓
NodeのcryptoではRSA秘密鍵の生成はできなそう
↓
Pure JavaScriptな外部モジュールを使う必要がある(Cライブラリに依存すると結局gypがいるため)
↓
Pure JavaScriptなものはある
https://www.npmjs.com/package/node-rsa
https://www.npmjs.com/package/node-forge
↓
やってみるとけっこう遅い
Generate RSA 2048bit (ミリ秒)
| | Average | Max | Min |
|---|---:|---:|---:|
| 既存 | 220 | 509 | 35 |
| node-rsa | 8,437 | 32,557 | 1,444 |
| node-forge | 6,489 | 16,461 | 746 |