web-dev-qa-db-ja.com

基礎となるデータを公開せずに重複を検出する

2人のユーザーが同じ識別子を使用できないようにする必要があるシナリオがあります。識別子は機密情報(社会保障番号など)であるため、DBに保存したくありません。後続のユーザーが再度使用できないようにするためのハッシュを保存したいだけです。また、データベースを漏えいした場合に攻撃者が元の値を把握できないように、それを安全に実行したいと考えています。

安全にできますか?推奨される方法は何ですか?

いくつかの調査に基づいて、HMACはうまくいくかもしれないようです。その場合、推奨されるアルゴリズムは何ですか?それは何か遅いもの(固定キーソルトを使用したscryptなど)である必要があります。そのため、キーが公開されたとしても、値を明らかにすることは困難です。またはそれに対する保護はありませんか?

6
Peter Watts

私はあなたが可能な解決策からそれほど遠くないと思います(別名、最新のKDFを使用し、これをパスワードのように効果的に扱います)ただし、さらにいくつかの考慮事項があります(すでにコメントで言及されています)。

  1. SSNのエントロピーは非常に低いため、ブルートフォースは特に簡単な攻撃です。
  2. SSNがどこで使用されたかを見つける必要があるため、基本的にソルトなしで操作する必要があります。これにより、ブルートフォーシング実質的にも簡単になります。

1と2の組み合わせは、KDFが唯一の選択肢であるにもかかわらず、KDFを悪い考えにするでしょう。その結果、別のbusinessソリューションを見つけることが適切な場合があります。ただし、SSNマッチングが絶対的な要件である場合、リスクを軽減するために実行できるいくつかの手順があると思います。

  1. 大きな「コショウ」を確認して使用してください。ペッパーはパスワードではあまり一般的に使用されないため、慣れていない場合は、ペッパーを使用すると、データベースに格納されていないハッシュ前に、SSNに大きな定数のランダムな文字列が追加されます。この場合、特に長い唐辛子を使用します。したがって、実際には、これは256ビットのキーを作成することを意味しますこれはデータベースまたはコードベースに保存されていませんですが、ハッシュする前にSSNに追加されます。プロダクションサーバーの環境変数またはCDパイプラインに保存するため、開発者は簡単にアクセスできません(残念ながら、開発者は攻撃者になることがあります)。これは、データベースがリークしても攻撃者がペッパーを持っていない場合、SSNをブルートフォースできないためです(SSNをブルートフォースする場合、基本的に256ビットキーをブルートフォースする必要があるため、不可能です)。
  2. 非常に大きなコスト関数を使用します。最近のすべてのKDFには構成可能なコスト関数があり、ハッシュの構築にかかる時間が長くなります(そのため、ブルートフォースが難しくなります)。このようなものについては、通常よりもさらに高いコスト関数を設定します。システムがSSN + pepperをハッシュするのに1〜2秒かかるように調整すると思います。ユーザーが待機を許容できる場合は、さらに高くしてください!これはブルートフォースの問題を解決しませんが、役立ちます。
  3. これらのハッシュ化されたSSNを匿名化してください!基本的には、システム内の他のデータに関連付ける方法なしで、それらをテーブルに単独で格納します(つまり、他のテーブルと相関する可能性があるため、このテーブルまたはエントリ時間に自動インクリメントIDを割り当てないでください)。この目的のためだけで、この目的のためだけにある、1つの列だけを含む1つのテーブルを用意します。 SSNだけでも個人情報ですが、それ以上anyの情報なしで漏洩した場合、ユーザーにとってはそれほど危険ではありません。ハッシュ化されたSSNのみを含むテーブルがある場合でも、SSNが以前に入力されたかどうかを確認できるため、全体的な目標を達成できます。

繰り返しますが、最善の策は、SSNを使用せずにこれを行う完全に異なる方法を見つけることです。ただし、これが絶対的なビジネス要件である場合、上記の手順は、顧客の個人データを保護するために非常に役立ちます。それでも、業界の規制要件を確認して、該当するすべてのルールを遵守していることを確認します。

10
Conor Mancone