Misskey: src/crypto_key.ccをTypeScriptに書き直してほしい

Created on 30 Sep 2018  ·  8Comments  ·  Source: syuilo/misskey

Summary

src/crypto_key.ccは実装者の得意言語で書かれているが、これだけC++で書かれており、node-gypを導入しビルドする必要がある。これは、コードの保守性を悪くし、Missekeyの導入を難しくしているように思われる。

可能ならばこの関数をNodeのcryptoなどを利用してTypeScriptで書き直してほしい。

Environment



Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

⚙️Server ✨Feature 🐢Performance 💬Discussion

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 |

All 8 comments

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

  • けっこう遅くなってしまう
  • node-gypでエラーが出る環境が出る条件がわからないので解決したかどうかわからない
  • 他にもnode-gypに依存しているモジュールがある(diskusageとか?)のでここを直しても要望が満たせなそう

なので微妙…

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のラッパーになってます。

暗号系のライブラリはあまり変えないほうがよい気がしますね(セキュリティ上の問題などもあるので)

Was this page helpful?
0 / 5 - 0 ratings