Firefox 拡張機能で実現する、セキュアなテキスト暗号化・復号ツール「cryptool_webext」

Page content

以前から、ちょっとしたテキスト(パスワードの断片や秘密のメモなど)を安全に、かつ手軽に暗号化して保存したり、送受信したりするためのツールが欲しいと考えていました。

世の中には多くの暗号化ツールや Web サービスがありますが、 「本当にそのサービスを信じて良いのか?」 「入力したデータが意図せずサーバに送られていないか?」 といった不安が拭いきれないこともあります。

そこで今回は、セキュリティを第一に考え、かつ利便性も損なわないテキスト暗号化・復号ツール 「cryptool_webext」 を自作しました。

実際のソースコードは以下に公開しています。 <https://github.com/ifritJP/cryptool_webext/tree/master>

なぜ Web 拡張機能(Web Extension)なのか

今回、このツールをスタンドアロンのアプリや Web サービスではなく、 Firefox の拡張機能として開発したのには明確な理由があります。

  • マルチプラットフォーム対応

    • Firefox が動作する環境であれば、PC(Windows, Linux, macOS)だけでなく Android スマホでも同じツールが利用できます。
  • 通信の規制を保証できる

    • Web 拡張機能は、その権限を `manifest.json` で厳格に管理します。
    • 今回のツールは、 `permissions` や `host_permissions` を空 に設定しており、外部への通信を一切行わないことをブラウザレベルで強制しています。
    • これにより、ユーザが意図しないデータの流出を仕組みとして防ぐことができます。
  • 導入のハードルが低い

    • ブラウザにインストールするだけで使えるため、専用のランタイムをインストールしたり、ビルド環境を整えたりする必要がありません。

cryptool_webext の構成

本ツールは、ブラウザ内のローカル環境で完結して動作します。 データの流れを簡略化すると以下のようになります。

このように、ブラウザが標準で提供している Web Crypto API を利用することで、信頼性の高い暗号化アルゴリズム(AES-GCM 256-bit)を高速に実行しています。

また、独自の AES-GCM 形式だけでなく、広く普及している PGP 形式(対称鍵暗号)もサポートするために、信頼性の高いライブラリである OpenPGP.js をバンドルして利用しています。これにより、既存の PGP エコシステムとの親和性も確保しました。

また、パスワードから暗号鍵を生成する際には、 PBKDF2 を使用し、反復回数を 600,000 回 という非常に高い値に設定しています。これにより、一般的なブルートフォース攻撃(総当たり攻撃)に対して十分な耐性を持たせています。

セキュリティ上の懸念と対策:キャッシュのリスク

Web 拡張機能として開発する上で、避けて通れないのが 「キャッシュ」 の問題です。

現代のブラウザや OS は、パフォーマンス向上のために様々なデータをキャッシュします。 暗号化ツールにおいて、入力した平文や復号後のデータが意図せずストレージ(スワップファイルやブラウザの内部キャッシュ)に書き込まれてしまうことは、重大なリスクとなります。

cryptool_webext では、このリスクを最小限にするために以下の対策を講じています。

  • メモリ上での処理を徹底と即時破棄

    • 復号処理が終わった直後に、生のバイナリデータが格納されていたバッファを `fill(0)` でゼロ埋め し、物理的に消去しています。
    • これにより、処理後のメモリをダンプされても機密情報が残りにくいように配慮しています。
  • ブラウザのキャッシュ・表示制御

    • 拡張機能のページ自体がキャッシュされないよう設定しているほか、 `visibilitychange` イベントを監視しています。
    • タブを切り替えたり、ブラウザを最小化したりして画面から消えた瞬間に、平文データをメモリからクリアする仕組みを導入しました。

とはいえ、ブラウザの基盤部分や OS の仮想メモリ管理(スワップ)によるキャッシュを完全に防ぐことには 限界があります。 そのため、極めて機密性の高い情報については、シークレットモードでの利用を推奨するなど、最終的にはユーザ自身の責任において運用していただく必要があります。 このあたりの「道具としての限界」を理解して使うことは、セキュリティにおいて非常に重要だと考えています。

AI エージェントを活用した開発プロセス

今回の開発において特筆すべき点は、 コーディングの大部分を AI エージェントが行い、人間(私)がそれをレビューする というスタイルを採用したことです。

最近の AI の進歩は目覚ましく、特に暗号化のような定型的ながらもミスが許されないロジックの記述において、 AI は非常に強力なパートナーとなります。

  • セキュアなコードの追求

    • AI と対話しながら、「この実装では XSS の脆弱性はないか?」「サイドチャネル攻撃の耐性は?」といったレビューを繰り返し行いました。
    • AI は膨大な学習データを元に、一般的な脆弱性を回避するコードを即座に提示してくれます。
  • 論理的な妥当性の確認

    • プログラミング言語の自作を趣味としている身としては、AI が生成したコードの論理構造をチェックするのは楽しい作業でもありました。

もちろん、AI が出力したものをそのまま鵜呑みにすることはありません。 最終的な責任は開発者である人間にあります。 しかし、AI を「単なる清書ツール」ではなく「セキュリティレビューを兼ねたエージェント」として扱うことで、短期間で高い品質のコードを書き上げることができました。

まとめと今後の展望

今回作成した cryptool_webext は、派手な機能はありませんが、 「安全に、どこでも、安心して使える」 という、自分が本当に欲しかった道具としての形を具現化したものです。

今後は、さらに使い勝手を向上させるための UI 改善や、 最新の Web 標準に合わせたセキュリティ強化などを進めていきたいと考えています。

もし、「手軽に使える暗号化ツールが欲しいけれど、オンラインサービスはちょっと怖い」と感じている方がいれば、ぜひ試してみてください。

以上。