鍵導出関数 – ブルートフォース攻撃への対策
Argon2などのKDFが現代のパスワード安全性の中心にある理由
はじめに
現代のセキュリティシステムでは、パスワードをそのまま暗号鍵として使うことは不十分です。 パスワードは一般にエントロピーが限られており、ブルートフォースや辞書攻撃などの体系的な攻撃に弱くなります。
鍵導出関数(KDF)は、そのようなパスワードを安全な鍵へ変換します。 意図的に計算時間とメモリ使用量を増やすことで、 各推測のコストを人為的に高めます。
VisuKeyのようなシステムでは、この段階が特に重要です。 生体情報や画像に基づく入力(例:画像の埋め込みベクトル)から 安定した鍵を導出します。入力は完全に決定的ではないため、 KDFは微小な変動が自明に推測できる鍵につながらないことも保証する必要があります。
信号処理・誤り訂正・鍵導出の組み合わせが、 安全な画像ベース認証システムの基盤となります。
単純なパスワードの問題
情報理論的には、パスワードはエントロピーが限られた情報源です。 探索空間が大きく見えても、ユーザーがランダムな文字列を選ばないため、 実効的な安全性はしばしばはるかに低くなります。
典型的な例:
62⁸ ≈ 2.18 × 10¹⁴ 通りの組み合わせ
しかし現代の攻撃者はGPUや専用ハードウェア(ASIC)を用いて 毎秒数十億回のハッシュ計算が可能です。 その結果、実効的な攻撃時間は劇的に短くなります。
根本的な問題は次のとおりです。
- パスワードは一様分布ではない
- パスワードの実効エントロピーは低い
- ハッシュが漏れればパスワードはオフラインで攻撃可能になる
VisuKeyでも同様の問題があります。 画像やその埋め込みは完全な乱数値ではありません。 得られるビット列には相関がありエントロピーも下がるため、 追加の強化なしでは攻撃されやすくなります。
鍵導出の基本原理
形式的には、鍵導出関数は決定的な写像として記述できます。
K = KDF(P, S, C)
ここで:
- P: パスワードまたは生入力(例:埋め込みベクトル)
- S: ソルト(ランダムだが秘密ではない値)
- C: コストパラメータ(時間・メモリ・並列度)
ソルトには次の2つの中心的な役割があります。
- 同一入力でも同じ鍵にならないようにする
- 事前計算攻撃(レインボーテーブル)を無効にする
KDFそのものは次のように設計されています。
- 効率的に逆算できない
- 構造的なショートカットを許さない
- 意図的に専用ハードウェアに不利である
攻撃者がソルトを知っていても(これは普通に起こります)、 安全性はソルトの秘匿ではなくKDFの計算量に基づくため、 鍵は保護されたままです。
VisuKeyでは、信号が安定化した後にこの段階を適用し、 訂正されたビットパターンから暗号的に安全な鍵を生成します。
例:パスワードから鍵へ
鍵導出関数の流れを理解するため、具体例を見ます。
与えられた条件:
- パスワード:
myPassword123 - ソルト:
0xA7F3C91B(ランダム生成) - パラメータ: Argon2id、m = 64 MB、t = 3、p = 2
KDFは次を計算します。
K = Argon2id("myPassword123", Salt, Parameters)
結果は一見ランダムなビット列です。例:
0x9f3a7c2d...b81e
重要な性質:
- 出力は決定的(同じ入力→同じ鍵)
- パスワードのわずかな変更でも結果はまったく異なる
- 鍵は逆算できない
パスワードを通常の意味で「暗号化」しているのではなく、 一方向で意図的に高コストな変換を通しているのです。
時間ベースのコスト
現代のKDFの中心的な性質は、計算時間を制御して増やせることです。 反復や逐次的な依存関係によって実現されることが多いです。
ブルートフォース攻撃の総コストは、次で近似できます。
T ≈ N × tKDF
ここで:
- N: 候補の個数
- tKDF: KDF 1回あたりの時間
例:
- tKDF = 100 ms
- N = 10⁹
→ T ≈ 3 年
正当な利用者にはこの遅延はほとんど感じられませんが、 攻撃者にとっては指数関数的に高くなります。
メモリベースのコスト
現代のKDFの決定的な進歩はメモリハード性(memory hardness)の導入です。 アルゴリズムを大きなメモリ領域を必要とするよう構成します。
それにより次の2つの効果があります。
- GPU上の並列度が下がる
- 専用攻撃のためのハードウェア負担が増える
CPUは大きく柔軟なメモリを持てますが、 GPUスレッドあたりのメモリは厳しく制限されます。
メモリ集約型のKDFは、攻撃者に次のいずれかを強います。
- 並列スレッド数を減らす
- はるかに多くのハードウェアを投入する
この仕組みこそがArgon2を特に有効にしています。
Argon2 – 現代的標準
Argon2はメモリ集約型の構造に基づき、 大きなメモリブロックを反復的に埋め結合します。
計算は複数のフェーズで進みます。
- パスワードとソルトでメモリを初期化する
- メモリ上を複数回走査する
- データ依存またはデータ非依存のアクセスパターン
バリアントはアクセスの仕方が異なります。
- Argon2d: データ依存 → 速いがサイドチャネルに弱い
- Argon2i: データ非依存 → サイドチャネルに強い
- Argon2id: ハイブリッド → 推奨
Argon2のパラメータ
Argon2の安全性は、パラメータによって完全に決まります。
- メモリコスト(m): 使用するメモリの大きさ
- 時間コスト(t): 反復回数
- 並列度(p): 並列スレッド数
これらはハッシュあたりのリソース消費を定義し、 攻撃コストに直結します。
セキュリティ重視の用途では、典型的には次の範囲です。
- m = 64–256 MB
- t = 2–4
- p = 2–4
最適値はシステムに強く依存し、実測で決めるべきです。
VisuKeyでの応用
VisuKeyではKDFをパスワードに直接適用するのではなく、 画像から得た特徴ベクトルに適用します。
典型的な流れは次のとおりです。
- 画像 → 埋め込み(例:ニューラルネットワーク)
- 埋め込みの二値化
- 誤り訂正(例:BCH符号)
- KDF(Argon2)→ 最終鍵
KDFはここで同時に複数の役割を果たします。
- 得られる鍵のエントロピーを高める
- 埋め込みに対する構造的攻撃を防ぐ
- 類似画像のブルートフォース再構成に対する耐性を高める
特に誤り訂正との組み合わせが重要で、 入力信号の微小な変動はKDFの前に安定化する必要があります。
まとめ
鍵導出関数は現代の暗号システムの中核です。 低エントロピーの入力を頑健な鍵へ変換し、 攻撃者のコストを意図的に高めます。
Argon2により、時間とメモリの両面で強化する方式が利用でき、 現代のハードウェア攻撃に合わせて調整されています。
VisuKeyのようなシステムでは、KDFは信号処理と暗号のあいだをつなぐ決定的な役割を持ち、 不完全な現実データから安全に鍵を導出できます。
著者: Ruedi von Kryentech
作成: 2026年4月6日 · 最終更新: 2026年4月6日
最終更新時点の技術的内容。