コンテンツにスキップ

case03(再識別デモ): 攻撃の設計 — 4/7

弱点の評価 で見た2つの弱点を、どう組み合わせれば再識別できるか——攻撃者の手順を設計します。これは「攻撃を推奨する」ためではなく、安易な匿名化がいかに脆いかを具体的に理解し、正しい対策に結びつけるための教材です。

攻撃の全体像

flowchart TD
    A["公開データ(ハッシュ化済み履歴)<br/>運転者ハッシュ+乗降・料金"] --> B
    K["攻撃者が知っている1件<br/>自分が乗った運転手のID(乗務員証)"] --> B
    B["① 加工方法の特定<br/>sha256(既知ID) が公開データに一致するか"] -->|一致した| C
    B -->|一致しない| X["別の加工方法を疑う<br/>(ソルト・鍵・別アルゴリズム)"]
    C["② 総当りで対応表を構築<br/>公知フォーマット 100-NNN-NNN を全列挙し<br/>ハッシュ→ID の逆引き表を作る"] --> D
    D["③ 公開履歴のハッシュを引き当て<br/>運転者IDを全行に復元"] --> E["再識別された走行履歴<br/>「誰が」いつ・どこを走ったか"]

各ステップの狙い

ステップ やること 効かせる弱点 得られるもの
① 加工方法の特定 既知の運転者ID(自分が乗った運転手)を SHA-256 にかけ、公開データのハッシュ列に一致があるか確認 ② 単純な無ソルト SHA-256 「加工は無ソルト SHA-256」という確証
② 対応表の構築 公知フォーマット 100-NNN-NNN全候補(約100万通り)を計算し、ハッシュ→ID の対応表を作る ① 形式が公知・低エントロピー 逆引き表(レインボーテーブル相当)
③ 全復元 公開履歴の各行の運転者ハッシュを対応表で引き当て、元の運転者IDに置換 ①② の合わせ技 運転者IDを復元した走行履歴

なぜ「①方法の特定」が要るの?いきなり総当りでは?

総当り(②)はいつでもできますが、加工方法が分からなければ「何を」総当りすべきか決まりません(ソルト付きか、HMACか、そもそも別アルゴリズムか)。攻撃者は既知の1件(自分が乗った運転手のIDとそのハッシュ)を使って、「素の SHA-256 を全候補にかければ一致する」と先に確かめてから、安心して総当りに進みます。たった1つの既知の平文が、加工方法全体を暴く鍵になる——ここが弱点②の怖さです。

①と②がそろうと何が起きるか

  • ①だけ(方法は分かるが候補が無限): 総当りは非現実的で復元できない。
  • ②だけ(候補は少ないが方法が不明): 何を計算すればいいか分からない。
  • ①+②(本件): 「素の SHA-256 を、約100万通りの候補に」総当りするだけ。数秒で全運転者IDが復元され、公開履歴が「誰の記録か」丸わかりになる。

この設計が示すこと(対策への布石)

攻撃が成立する条件を裏返すと、そのまま対策になります(詳細は 結果)。

  • 候補を絞らせない: IDそのものを公開データに出さない/十分に長いランダムな仮IDに置換する。
  • ハッシュの使い回しを防ぐ: ソルト秘密鍵つきハッシュ(HMAC)で、同じIDでも出力が再現できないようにする。
  • そもそも粒度を落とす: 個人単位の識別子を残さず、一般化・集計して連結できないようにする(=匿名加工の考え方 / case02)。

→ 具体的な処理は 攻撃の仕様、実行は ② 実装(Colab)、復元後のスキーマは 復元後テーブル