case03(再識別デモ): 攻撃の仕様 — 5/7¶
前提(攻撃者が持っているもの)¶
- 公開データ: ハッシュ化済み履歴(運転者ハッシュ+乗降・料金)。
- 公知の知識: 運転者IDの形式
100-NNN-NNN(先頭の事業者コード100は固定・公表)。 - 既知の1件: 自分が乗ったタクシー運転手の運転者ID(乗務員証に表示)。1つだけ元IDが分かっている。
主なルール¶
- ハッシュ化(事業者側の加工・比較用に再現):
運転者ハッシュ = sha256(運転者ID)の16進64桁。ソルト・秘密鍵なし。走行IDは公開時に落とす。 - ① 加工方法の特定:
sha256(既知の運転者ID)を計算し、公開データの運転者ハッシュ集合に含まれるかを確認。含まれれば「無ソルトSHA-256」で確定。 - ② 対応表の構築(総当り):
100-{000..999}-{000..999}の全候補(10^6)を生成し、それぞれのSHA-256を計算。公開データに出現するハッシュだけをハッシュ → 運転者IDの辞書に記録する(メモリ節約のため、公開ハッシュ集合に一致した候補だけ保持)。 - ③ 全復元: 公開履歴の各行の
運転者ハッシュを対応表で引き、復元運転者ID列を付与。必要なら運転者マスタと突き合わせて氏名・営業所まで再識別する。 - 対策の検証: 事業者が
HMAC-SHA256(秘密鍵, 運転者ID)で加工していた場合、攻撃者は鍵を知らないので、同じ総当り(素のSHA-256)では1件も一致しないことを確認する。
攻撃仕様一覧(処理ごと)
| 段階 | 入力 | 処理 | 出力 |
|---|---|---|---|
| ハッシュ化(再現) | 走行履歴の運転者ID | 無ソルト sha256 |
運転者ハッシュ |
| ① 方法特定 | 既知の運転者ID | sha256 して公開集合と照合 |
一致(True/False) |
| ② 対応表 | 公知フォーマットの全候補 10^6 | sha256 を計算し公開ハッシュに一致するものを記録 |
ハッシュ→ID 辞書 |
| ③ 全復元 | 公開履歴の運転者ハッシュ | 対応表で逆引き | 復元運転者ID(全行) |
| 検証 | 復元運転者ID | 元の走行履歴の運転者IDと比較 | 全件一致(assert) |
| 対策 | HMAC で加工した公開ハッシュ | 素の sha256 で総当り |
一致0件(復元不能) |
計算量の目安
候補は約100万通り。短い文字列の SHA-256 を100万回計算しても、一般的な PC・Colab で数秒で終わります。「形式が公知」だと総当りが現実的になる、というのがこのデモの要点です(仮に9桁すべてが自由なら 10^9 通りで桁違いに重くなりますが、事業者コードの公知性がそれを 10^6 に縮めています)。
→ 実行は ② 実装(Colab)、復元後のスキーマは 復元後テーブル、結果と対策は ③ 結果。