Mindmap personal と Kiroku では、
エクスポートファイル(JSON)の暗号化に AES-GCM を採用しています。
この記事では、
- なぜJSONを暗号化する必要があるのか
- AES-GCMとは何か
- なぜこの暗号方式を選んだのか
- 改ざん検知がどのように実現されているのか
を、実装思想ベースで解説します。
なぜJSONエクスポートを暗号化するのか(技術的背景)
JSONは非常に扱いやすいデータ形式です。
- 人が読める
- JavaScriptと相性が良い
- デバッグしやすい
その一方で、そのままでは情報が丸見えという欠点があります。
Mindmap personal / Kiroku のJSONには、
- 思考の流れ
- 個人的なメモ
- タスクや計画
といった、第三者に見せる前提ではない情報が含まれます。
そのため、
- ファイル単体で安全に管理できる
- クラウドやUSBで移動しても内容が漏れにくい
状態を作る必要があり、暗号化を前提としました。
ブラウザアプリにおける暗号化の前提条件
今回の暗号化は、以下の制約条件の中で設計しています。
- ブラウザのみで完結する
- サーバーに秘密情報を送らない
- 外部ライブラリに依存しない
- 実用的な安全性を確保する
そのため、採用したのが Web Crypto API を利用した暗号化です。
AES-GCMとは何か
AES(Advanced Encryption Standard)
AESは、世界中で利用されている共通鍵暗号方式です。
- 高速
- 安全性が高い
- 多くの環境で標準対応
現在も「破られた実例がない」ことから、
実用暗号のデファクトスタンダードになっています。
GCM(Galois/Counter Mode)
GCMは、AESをどのように使うかを定義した「モード」の一種です。
最大の特徴は、
- 暗号化
- 改ざん検知(認証)
を同時に行える点です。
これにより、
- 内容を読めない
- 書き換えられていたら復号できない
という状態を実現できます。
なぜAES-GCMを採用したのか
AES-GCMを採用した理由は、次の4点です。
1. 暗号化と改ざん検知を一体で扱える
従来は、
- 暗号化
- ハッシュによる検証
を別々に行う必要がありました。
AES-GCMでは、これを1ステップで実現できます。
2. Web Crypto APIで安全に利用できる
ブラウザ標準のWeb Crypto APIは、
- 鍵管理が比較的安全
- 実装ミスを減らせる
という利点があります。
独自実装による事故を避ける意味でも、
標準APIを使う方針を取りました。
3. パフォーマンスが良い
マインドマップやメモのJSONは、
数KB〜数百KB程度になることがあります。
AES-GCMは高速なため、
- エクスポート
- インポート
どちらでも待ち時間がほぼ発生しません。
4. 実用レベルで十分な安全性
軍事レベルのセキュリティを目指すのではなく、
- 個人利用
- 思考・メモ管理
という用途において、現実的に十分な安全性を確保することを重視しました。
改ざん検知はどのように行われているか
AES-GCMでは、暗号化時に「認証タグ」が生成されます。
復号時には、
- 暗号文
- 初期化ベクトル(IV)
- 認証タグ
がすべて一致していなければ、復号に失敗します。
つまり、
- 1文字でも書き換えられる
- ファイルの一部が壊れる
と、正しいパスワードでも復号できません。
この仕様により、
- 壊れたデータを誤って使う
- 改ざんに気づかない
といったリスクを防いでいます。
パスワードについての考え方
パスワードは、
- 暗号鍵を生成するための材料
- サーバーに送信されない
- ローカルでのみ使用される
という扱いです。
ツール側では、
- パスワードを保存しない
- 復号できなければ元に戻せない
設計になっています。
これは利便性よりも、利用者自身の管理を尊重する方針によるものです。
まとめ:技術的にも「安心して使える」設計を目指して
Mindmap personal / Kiroku の暗号化は、
- JSONという扱いやすい形式
- ブラウザ完結という制約
- 実用的な安全性
これらのバランスを重視して設計しています。
AES-GCMの採用により、
- 内容を隠す
- 改ざんを検知する
という2つの要件を、シンプルな実装で実現しました。
今後も、
- 使いやすさ
- 安全性
- 無駄に複雑にしない
この方針を大切に、改善を続けていく予定です。



コメント