Web Crypto API AES暗号のパフォーマンス比較

Note

この記事は はてなエンジニア Advent Calendar 2024 - Hatena Developer Blog の 37日目(1/6)です。アドベントカレンダーってなんだっけと思ってきますが考えてはいけません。はてなのアドベントカレンダーは1月いっぱいまでやっているのです。

developer.hatenastaff.com

Note

昨日36日目の記事は id:yunagi_n さんの「Minecraft サーバーの状況を Mackerel で監視する - なつねこメモ」でした。Mackerel のメトリクスでプレイ中のユーザーが分かるのは面白いですね、ここから「〇〇人がログイン中」みたいな表記を作れたりしないだろうか…と思いながら読んでいました!

Web Crypto API は知っているか!

Web Crypto API というものがあります。Web の API ですが、この API を使うことで 乱数生成 や 共有鍵暗号、署名などができます。

developer.mozilla.org

ここでは、APIの使い方については解説しないためもし気になるならぜひ調べてみてください!結構前からあるAPIなので主要なブラウザはほぼ対応しているのでもしかすると仕事でも使うことができるかもしれません。

この API で AES という共通鍵暗号アルゴリズムを実装することが可能です。しかし、フロントエンドで暗号化、復号化した際にどれくらい処理に時間がかかるのか気になりませんか?私は気になります。

ja.wikipedia.org

私の知識では、公開鍵暗号より共通鍵暗号のほうが処理に時間がかからないのでそこまでパフォーマンスは悪く無いと思っています。

レギュレーション

計測のために、専用のリポジトリを作成しました。内部は Vite + React です。使用する暗号化アルゴリズムは AES-GCM で、暗号化と復号化を行いそれぞれの時間を計測します。

github.com

- -
暗号化アルゴリズム AES-GCM
tagLength 128bit
iv長 92
鍵長 256bit
鍵導出 PBKDF2

計測するページは、 GitHub Actions でデプロイして様々なデバイスで検証できるようにしています。ご自由にお試しください。

また、暗号化・復号化するデータは文字形式や文字長で複数ケースを用意しました。

Web Crypto API AES暗号計測

さらに、今回計測するのは私の手元にある以下のデバイスで行いたいと思います。

デバイス名 OS ブラウザ 備考
デスクトップPC Windows Chrome Intel Core i9-9900k, 32GB RAM, RTX2080
MacBook Air M1 2020 MacOS Sequoia 15.2 Chrome
iPhone13 iOS 18.2 Safari
iPad Air M2 13inch iPadOS 18.2 Safari

結果

デスクトップPC

種類 エンコード時間 デコード時間
日本語長文 0.100ms 0.100ms
default 0.100ms 0.000ms
日本語 0.100ms 0.100ms
1000文字アルファベット 0.100ms 0.100ms
emoji 0.100ms 0.100ms
1000文字日本語 0.100ms 0.100ms

MacBook Air M1 2020

種類 エンコード時間 デコード時間
日本語長文 0.200ms 0.100ms
default 0.100ms 0.200ms
日本語 0.100ms 0.100ms
1000文字アルファベット 0.200ms 0.000ms
emoji 0.100ms 0.100ms
1000文字日本語 0.100ms 0.000ms

iPhone13

種類 エンコード時間 デコード時間
日本語長文 1.00ms 0.000ms
default 0.000ms 0.000ms
日本語 0.000ms 0.000ms
1000文字アルファベット 0.000ms 0.000ms
emoji 2.000ms 0.000ms
1000文字日本語 1.000ms 0.000ms

iPad Air M2 13inch

種類 エンコード時間 デコード時間
日本語長文 0.000ms 1.000ms
default 0.000ms 0.000ms
日本語 0.000ms 0.000ms
1000文字アルファベット 1.000ms 0.000ms
emoji 1.000ms 0.000ms
1000文字日本語 0.000ms 0.000ms

ほぼほぼ 1ms 以下で暗号化・復号化できますね。本当は複数回やって計測するのがいいのですがまあ、今回はレポートではないので誤差とさせてください。

まとめ

Web Crypto API を使用した AES暗号はどのデバイスでも 1ms 以下で暗号化、復号化できるのであまりパフォーマンスは考えなくてもいいと思います。次回思いついたら公開鍵暗号もパフォーマンス計測したいです。

あと、今回は Android 端末で検証できていないので試したいですね。

余談

今回、GitHub - cateiru/web-crypto-api-measurement を作成するにあたり Chakra UI V3 を使ってみたのですが V2 と使い勝手が大きく変わり、必要なコンポーネントは npx することで components/ui/* にそのコンポーネントが作成されるような仕様でした。RSC 対応の影響かと思うのですが、 V2 からの移行は厳しいなという感想でした。 Perl 5 と 6 や Python 2 と 3 ぐらい違うので皆様お気をつけください。