web-dev-qa-db-ja.com

ハッシングでは不十分な場合、データを適切に匿名化する方法は?

今日は、ニューヨークシティがCab/Taxiのドライバーやその旅行などに関する情報をどのようにリリースしたかについての Bruce Schneierのブログ および ArsTechnica に関するニュースがあります。

基本的に、機密情報は単にMD5ハッシュされました。入力が制限されていたため(3つの数字、3つの文字、多くても3つ)、ブルートフォース攻撃を行うのは簡単でした。可能なすべての組み合わせを生成してから、ルックバックを実行しました。

情報の性質(すべての組み合わせを簡単に生成するための非常に小さな入力)を考慮して、このデータを適切に匿名化するにはどうすればよいですか?

私に起こったいくつかのアプローチ::

  • あいまいさによるセキュリティ( "秘密の"反復回数を使用)は、あいまいさによるセキュリティです。

  • 一般的な固有のソルトを追加すると、ブルートフォースが0%増加します。単純にソルトを追加して完了します。

  • ユーザーごとに一意のソルトを追加すると、ブルートフォースが増加しますが、それほど多くはありません。ソルトを取得し、各ソルトの3桁の3文字を計算します。

何ができるでしょうか?

9
woliveirajr

トークン化を使用できます。つまり、ランダムに生成されたIDが3つの数字と3つの文字にマッピングされた別個のデータベースを作成するということです。次に、実際のIDの代わりにトークンを挿入します。

別のオプションとして、データをマップする必要がない場合は、たとえば、ランダムに生成された長いシークレットを持つHMAC(ハッシュアルゴリズム)を使用できます。シークレットがなければ、1つの文字だけで構成されていても、元のIDを総当たりにすることはできません。

HMACを使用することは、実際には「秘密の塩」を使用する正しい方法です(塩は実際には暗号で秘密と見なされることはありません)。

13
Lucas Kauffman

データを解放しない方法は、データを解放しないことです。

トークン化はあまりうまく機能しません。なぜなら、ドライバーがどこにいて、いつドライバーがどこにあるかを知ることであり、ドライバーのトークンがわかっているからです。

私がこれを理解できるようにしたくない場合は、そのデータをいかなる形でもリリースしないでください。

4
jjanes

入力が制限されている場合、常にこの問題が発生します。

唯一の解決策は、入力を多様化するための「もの」をさらに追加することです。あなたが言ったように、塩はオプションですが、それが危険にさらされた場合、それはあまり良くありません。秘密鍵やパスワードを使用する場合も同様です。

この特定のケースでは、答えはタクシーに関する詳細情報を連結することだと思います。例えば:

Nonce | Driver Name | Driver's License | License Plate | ...

基本的には、ナンバープレートの簡単な力ずくの強制を補うためのより豊富な入力です。ああ、そして明らかに、暗号的に安全なハッシュ関数を使用します:-)

1
sazr

匿名化したい場合は、キーを提供しません。プライベートデータのnoncedハッシュ、代理トークン、何もありません。

「A Driver」、「Another Driver」、「Another Driver」などと言うだけです。

特定のドライバーをその個人データに参照して戻す必要がある場合は、その代理トークン(データベース内の各ドライバーのguid/uuid)が必要になります。ただし、唯一の目的が匿名のドライバーに関する統計を公開することである場合は、キーは必要ありません。機密性の低いデータをリストするだけです。

1
Andrew Hoffman