コンテンツへスキップ
HexaTransfer
ブログへ戻る
暗号化とセキュリティ

暗号鍵の仕組み:ファイルセキュリティの基礎

暗号鍵の仕組みをわかりやすく解説。鍵の生成・交換・管理がセキュアなファイル共有を可能にする方法。

暗号鍵とはデータを施錠・開錠するランダムなビット列です。現代のファイル転送では、暗号学的に安全な乱数生成器(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・あらゆる真剣なファイル転送サービスはすべてハイブリッド暗号化を採用しています。

  1. ランダムな256ビット AES 鍵(「セッション鍵」または「ファイル鍵」)を生成する。
  2. AES-256-GCM でファイルを暗号化する。
  3. セッション鍵を受信者の公開鍵で暗号化する。
  4. 両方を送信する。

受信者は秘密鍵でセッション鍵を復号し、それでファイルを復号します。対称暗号の速度と非対称暗号の鍵配布の便利さを両立できます。

ブラウザベースのファイル転送では、「公開鍵」の役割を 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のファイルを無料で転送。アカウント不要。ファイルはアップロード前にブラウザで暗号化されるため、他の誰にも読まれません。

ファイルを送信