コンテンツにスキップ

case03(再識別デモ): 攻撃の仕様 — 5/7

攻撃の設計 の手順を、具体的な処理に落とし込みます。実際の Python コードと実行は ② Colab で。

前提(攻撃者が持っているもの)

  • 公開データ: ハッシュ化済み履歴(運転者ハッシュ+乗降・料金)。
  • 公知の知識: 運転者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)、復元後のスキーマは 復元後テーブル、結果と対策は ③ 結果