2

人の姓、名、生年月日の組み合わせをハッシュとして保存する必要があります。このハッシュは、後でまったく同じプロパティを持つ同じ人物を検索するために使用されます。私の質問は、SHA-1 がこれに対して意味のあるアルゴリズムであるかどうかです。

私が SHA-1 を理解している限り、(異なる属性を持つ) 2 人の異なる人物が同じハッシュ値を取得する可能性は事実上ありません。これは正しいですか?

4

3 に答える 3

1

ハッシュの衝突は避けられません。衝突の可能性はわずかですが、本当に 100% の識別が必要な場合は、ハッシュだけに頼るべきではありません。

ハッシュを使用してデータベース検索を高速化する場合、SHA256 を使用する必要はありません。システムにある最小サイズのハッシュ関数を使用します (MySQL の場合は MD5()、データベースがそれほど大きくない場合は CRC32 を試すこともできます)。テーブルをクエリするときは、検索するすべての条件を指定する必要があります。

SELECT * from user WHERE hash="AABBCCDD" AND firstname="Pavel" AND surname="Sokolov"

データベースは、インデックス カーディナリティと呼ばれる値を維持します。これは、特定のインデックス上のデータの一意性の尺度です。したがって、ハッシュ フィールドと一緒に必要なフィールドにインデックスを付けることができ、データベースはクエリに対して最も選択的なインデックスを選択します。ほとんどのデータベースは、テーブルからデータを選択するときに 1 つのインデックスしか使用できず、カーディナリティ値が最も高いインデックスを選択するため、条件を追加してもパフォーマンスに悪影響はありません。

データベースは、最初にインデックスに一致するすべての行を選択し、次にそれらをスキャンして、他の条件に一致しない行を破棄する必要があります。

私が説明した方法を使用できない場合は、MD5 の衝突確率でも人名のデータベースで発生する可能性は非常に低いと思います。

PS 「人の姓、名、生年月日の組み合わせ」だけでは、人間を 100% 識別するのに十分ではないことをご存知ですか? そして、いくつかのハッシュが衝突するよりも早く、この組み合わせが一致します。

于 2011-04-13T21:04:21.650 に答える
1

これらの資格情報のみを知っている人を検索する場合は、SHA-1 をデータベースに保存できます (1,000 兆人をサンプリングする場合を除き、高速化のために MD5 を使用できます)。

ハッシュには個人に関する情報が保存されていないため、価値はありませんが、データベースの検索には使用できます。3 つの情報が一致することを確認したいだけなので、それらを連結するだけで安全です。

user.hash = SHA1(user.firstName + user.DOB + user.lastName)

クエリを実行すると、2 つが一致するかどうかを確認できます。

hash = SHA1(query.firstName + query.DOB + query.lastName)

for user in database:
  if user.hash == hash:
    return user

と同じ日に生まれたquery.DOB場合など、姓と名が衝突する可能性があるため、真ん中に入れました. 私は数字の名前を認識していないので、これでそのような衝突が止まると思います;)JohnDoe BobJohn DoeBob

しかし、これが大きなデータベースである場合は、MD5 を試してみます。高速ですが、衝突の可能性があります (あなたの場合、衝突が発生しないことを保証できます)。ただし、衝突の可能性は非常に小さいです。

概観すると、衝突は次のような1 / 2^128発生です。

                          1
---------------------------------------------------
340,282,366,920,938,463,463,374,607,431,768,211,456

そして、それは次のものより少し小さいです:

0.0000000000000000000000000000000000000293873 %

衝突することはないと確信しています;

于 2011-04-13T20:52:02.140 に答える
0

衝突が心配な場合は、ここで良い議論があります:

sha-1衝突の弱点を理解する

セキュリティ上の懸念がある場合は、代わりにSHA-256を検討します。

于 2011-04-13T20:57:26.817 に答える