暗号鍵の仕組み:ファイルセキュリティの基礎
暗号鍵の仕組みをわかりやすく解説。鍵の生成・交換・管理がセキュアなファイル共有を可能にする方法。
暗号鍵とはデータを施錠・開錠するランダムなビット列です。現代のファイル転送では、暗号学的に安全な乱数生成器(CSPRNG)が生成する256ビットの AES 鍵、すなわち32バイトのランダムデータが標準です。10 GB の動画を暗号文に変換するのも、その暗号文を元に戻すのも、同一のアルゴリズムと完全に同じ鍵のみが可能です。鍵のセキュリティこそが暗号化の生命線です。完璧な AES-256 暗号も、鍵が弱く・予測可能で・漏洩すれば無意味になります。本記事では HexaTransfer・Tresorit・Proton Drive など実際のサービスで鍵がどのように生成・共有・保存・破棄されるかを解説します。
鍵はただのランダムな数
256ビットの鍵は32バイトです。ブラウザで生成すると次のようになります。
const key = crypto.getRandomValues(new Uint8Array(32));
// Uint8Array(32) [183, 45, 201, 77, ...]
これを「鍵」とするのはアルゴリズムによる使用方法です。AES-256-GCM は256ビットの鍵を鍵スケジュールで15個のラウンド鍵に展開し、128ビットのブロックを14ラウンドにわたってスクランブルします。数学的には、ビットがどこから来たかは問わず、ただ秘密で予測不可能であることが求められます。
「予測不可能」がより難しい要件です。攻撃者が乱数生成器の状態を推測できれば、鍵を再生成できます。2006年の Debian OpenSSL バグは、2年間にわたって鍵のエントロピーを15ビットに削減していました。ランダム性が失敗したときに何が起きるかを示す典型例です。
暗号学的に安全な乱数生成
ブラウザは crypto.getRandomValues() を提供しており、OS の CSPRNG から引き出します。Linux では /dev/urandom、Windows では BCryptGenRandom、macOS では SecRandomCopyBytes が使われます。これらはさらに割り込みタイミング・ディスクシークタイム・Intel RDRAND などのハードウェア RNG チップなど複数のエントロピー源を混合します。
Math.random() を鍵に使用してはいけません。予測可能なメルセンヌツイスターであり、数回の出力から状態が復元できることが多くあります。
サーバーサイドでは、Node.js の crypto.randomBytes() と Python の secrets.token_bytes() が OS の CSPRNG をラップしており安全です。NIST SP 800-90A・SP 800-90B が CSPRNG の要件を定義しており、Linux カーネル5.17以降はこれを満たす BLAKE2s ベースの設計を採用しています。
対称鍵:1つの鍵で双方向に
AES のような対称アルゴリズムは暗号化と復号に同一の鍵を使います。鍵サイズのオプションは以下のとおりです。
- 128ビット:2^128 通り、ほとんどの用途で安全。NSA CNSSP-15 で SECRET レベルに承認。
- 192ビット:一部の政府用途で使用、比較的まれ。
- 256ビット:2^256 通り、TOP SECRET に承認。現在のファイル転送サービスのデフォルト。
鍵サイズを2倍にしてもブルートフォースの難しさは2倍にはなりません。2乗されます。2^128 はすでに手の届かない領域です(地球上の全コンピューターが宇宙の寿命の100億倍動かし続けても)。256ビットは量子コンピューターへのヘッジです。Grover アルゴリズムが対称鍵の強度を実効的に半減させます。
対称鍵の難題は、同じ鍵を相手に傍受されずに届けることです。
非対称鍵:ペアの仕組み
公開鍵暗号は鍵配布を解決します。各当事者が数学的に連結した鍵ペアを生成します。公開鍵は誰でも見られる形で共有され、秘密鍵は本人だけが保持します。公開鍵で暗号化されたデータは秘密鍵でのみ復号できます。
主な非対称鍵の種類は以下のとおりです。
- RSA-2048:2048ビットの素数積、広くサポートされているが低速。TLS 証明書で使用。
- RSA-4096:より強固だが更に低速。
- Curve25519(X25519):256ビット楕円曲線鍵、高速。Signal と WireGuard で採用。
- Ed25519:256ビット署名鍵、SSH と Git のコミット署名で使用。
秘密鍵のサイズはアルゴリズムによって32〜512バイトです。RSA 秘密鍵は複数の素数を含むため大きく、Curve25519 秘密鍵は単に32バイトのランダムデータです。
ハイブリッド:実用システムでの組み合わせ
実際のシステムでは大きなファイルを RSA で直接暗号化しません。TLS・PGP・Age・Signal・あらゆる真剣なファイル転送サービスはすべてハイブリッド暗号化を採用しています。
- ランダムな256ビット AES 鍵(「セッション鍵」または「ファイル鍵」)を生成する。
- AES-256-GCM でファイルを暗号化する。
- セッション鍵を受信者の公開鍵で暗号化する。
- 両方を送信する。
受信者は秘密鍵でセッション鍵を復号し、それでファイルを復号します。対称暗号の速度と非対称暗号の鍵配布の便利さを両立できます。
ブラウザベースのファイル転送では、「公開鍵」の役割を URL フラグメントが代替することが多くあります。送信者がセッション鍵を生成して # 以降の URL に埋め込み、受信者のブラウザがローカルで読み取ります。受信者が鍵ペアを持つ必要がなく、シンプルです。
パスワードからの鍵導出
ユーザーはパスワードを入力します。アルゴリズムは均一なランダムビットを要求します。鍵導出関数(KDF)がこれを橋渡しします。
- PBKDF2-HMAC-SHA-256:60万回のイテレーション(OWASP 2023推奨)。Web Crypto API で利用可能。
- scrypt:メモリハードネスで GPU 攻撃に耐性。パラメータ
N=2^17, r=8, p=1。 - Argon2id:現在のベストプラクティスで2015年パスワードハッシュコンペティションの優勝者。パラメータ
memory=64 MB, iterations=3, parallelism=4。
KDF はソルト(ランダム値、暗号文と一緒に保存)と作業係数(イテレーション数)を追加してブルートフォースを遅らせます。Argon2id と64 MB のメモリで処理した12文字のランダムパスワードを GPU ファームで総当たりするには数千年かかります。KDF はエントロピーのないところから加えることはできないため、summer2024 のような弱いパスワードは KDF の種類にかかわらず数秒で解読されます。
鍵の保存場所
鍵はどこかに存在しなければならず、その場所がセキュリティ上の重要な判断です。
- ブラウザメモリ(セッション限定):一時的なファイル転送のデフォルト。ページ読み込み内で生成・使用・破棄されます。
- URL フラグメント:リンクで共有され、受信者のブラウザ履歴に保存されます。有効期限が重要です。
- ローカルストレージ / IndexedDB:永続的ですが、オリジン上のすべての JavaScript がアクセスできます。別の鍵で暗号化しない限りリスクがあります。
- OS キーチェーン:macOS Keychain・Windows DPAPI・Linux libsecret。一部のプラットフォームではハードウェアバック。
- ハードウェアセキュリティモジュール(HSM):YubiKey・クラウド HSM(AWS CloudHSM・Azure Dedicated HSM)。鍵がハードウェアを離れません。
- 鍵管理サービス(KMS):AWS KMS・Google Cloud KMS・HashiCorp Vault。一元管理で監査可能、月約1ドル/鍵。
ゼロ知識ファイル転送では、鍵は URL フラグメントと送信者のブラウザに存在します。サーバーは保存しません。
鍵のローテーションと破棄
長期間使われる鍵はリスクを蓄積します。ベストプラクティスはローテーションです。
- TLS 証明書:90日ごとのローテーション(Let's Encrypt デフォルト)、公的 CA では最大398日。
- データ暗号鍵:コンプライアンスシステムでは通常90日〜1年でローテーション(PCI DSS 4.0 要件3.6)。
- マスター鍵:年1回または人員変更時にローテーション。
破棄も重要です。ディスクから鍵ファイルを削除するだけでは不十分です。SSD はウェアレベリング領域にデータを保持する可能性があります。安全な破棄には上書きまたは HSM の専用削除コマンドが必要です。鍵を破棄して暗号化データを永続的に読み不能にする暗号消去は、バルクデータに対して最もクリーンなアプローチです。
ファイル転送サービスは通常、転送の有効期間(24時間〜7日)のみ存在するファイルごとの鍵を使用し、有効期限切れとともに暗号文とともに破棄します。
弱い鍵管理を見分けるサイン
注意すべき3つのよくある失敗パターンです。
- クライアントコードにハードコードされた鍵:全ユーザーで鍵が同じ場合、それは鍵ではなく難読化です。
- 暗号文と同じサーバーやデータベースに保存された鍵:侵害で両方が露出します。
- 鍵のローテーションなし:10年物の暗号鍵を持つレガシーシステムには10年分の侵害リスクが蓄積されています。
信頼できるサービスは、鍵の生成・保存・ローテーション・破棄を網羅した暗号化ホワイトペーパーを公開し、Cure53 や Trail of Bits などのサードパーティ監査を受けています。
hexatransfer.comでお試しください — 無料、登録不要、最大10GB。
エンドツーエンド暗号化で大容量ファイルを安全に送信
エンドツーエンド暗号化で最大10GBのファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。
ファイルを送信