今日は、ニューヨークシティがCab/Taxiのドライバーやその旅行などに関する情報をどのようにリリースしたかについての Bruce Schneierのブログ および ArsTechnica に関するニュースがあります。
基本的に、機密情報は単にMD5ハッシュされました。入力が制限されていたため(3つの数字、3つの文字、多くても3つ)、ブルートフォース攻撃を行うのは簡単でした。可能なすべての組み合わせを生成してから、ルックバックを実行しました。
情報の性質(すべての組み合わせを簡単に生成するための非常に小さな入力)を考慮して、このデータを適切に匿名化するにはどうすればよいですか?
私に起こったいくつかのアプローチ::
あいまいさによるセキュリティ( "秘密の"反復回数を使用)は、あいまいさによるセキュリティです。
一般的な固有のソルトを追加すると、ブルートフォースが0%増加します。単純にソルトを追加して完了します。
ユーザーごとに一意のソルトを追加すると、ブルートフォースが増加しますが、それほど多くはありません。ソルトを取得し、各ソルトの3桁の3文字を計算します。
何ができるでしょうか?
トークン化を使用できます。つまり、ランダムに生成されたIDが3つの数字と3つの文字にマッピングされた別個のデータベースを作成するということです。次に、実際のIDの代わりにトークンを挿入します。
別のオプションとして、データをマップする必要がない場合は、たとえば、ランダムに生成された長いシークレットを持つHMAC(ハッシュアルゴリズム)を使用できます。シークレットがなければ、1つの文字だけで構成されていても、元のIDを総当たりにすることはできません。
HMACを使用することは、実際には「秘密の塩」を使用する正しい方法です(塩は実際には暗号で秘密と見なされることはありません)。
データを解放しない方法は、データを解放しないことです。
トークン化はあまりうまく機能しません。なぜなら、ドライバーがどこにいて、いつドライバーがどこにあるかを知ることであり、ドライバーのトークンがわかっているからです。
私がこれを理解できるようにしたくない場合は、そのデータをいかなる形でもリリースしないでください。
入力が制限されている場合、常にこの問題が発生します。
唯一の解決策は、入力を多様化するための「もの」をさらに追加することです。あなたが言ったように、塩はオプションですが、それが危険にさらされた場合、それはあまり良くありません。秘密鍵やパスワードを使用する場合も同様です。
この特定のケースでは、答えはタクシーに関する詳細情報を連結することだと思います。例えば:
Nonce | Driver Name | Driver's License | License Plate | ...
基本的には、ナンバープレートの簡単な力ずくの強制を補うためのより豊富な入力です。ああ、そして明らかに、暗号的に安全なハッシュ関数を使用します:-)
匿名化したい場合は、キーを提供しません。プライベートデータのnoncedハッシュ、代理トークン、何もありません。
「A Driver」、「Another Driver」、「Another Driver」などと言うだけです。
特定のドライバーをその個人データに参照して戻す必要がある場合は、その代理トークン(データベース内の各ドライバーのguid/uuid)が必要になります。ただし、唯一の目的が匿名のドライバーに関する統計を公開することである場合は、キーは必要ありません。機密性の低いデータをリストするだけです。