我必须将姓氏,姓氏和出生日期的组合保存为散列。这个散列稍后用于搜索具有完全相同属性的同一个人。 我的问题是,如果SHA-1是一个有意义的算法。散列名称,姓氏和出生日期的算法
据我了解SHA-1,两个不同的人(具有不同的属性)几乎不可能获得相同的散列值。这是正确的吗?
我必须将姓氏,姓氏和出生日期的组合保存为散列。这个散列稍后用于搜索具有完全相同属性的同一个人。 我的问题是,如果SHA-1是一个有意义的算法。散列名称,姓氏和出生日期的算法
据我了解SHA-1,两个不同的人(具有不同的属性)几乎不可能获得相同的散列值。这是正确的吗?
如果你想搜索知道只有这些证书的人,你可以店的SHA-1在数据库(或MD5速度,除非你有一个像千万亿人到样品)。
哈希将毫无价值,因为它不存储关于此人的信息,但它可以用于搜索数据库。你只是想确保三块信息匹配的,所以这将是安全的,只是将它们连接起来:
user.hash = SHA1(user.firstName + user.DOB + user.lastName)
当您查询,您可以检查是否两个匹配:
hash = SHA1(query.firstName + query.DOB + query.lastName)
for user in database:
if user.hash == hash:
return user
我把query.DOB
放在中间,因为名字和姓可能会碰撞,就像JohnDoe Bob
出生在John DoeBob
的同一天。我不知道数字名称,所以我认为这会阻止类似的冲突;)
但是,如果这是一个大型数据库,我会尝试MD5。它速度更快,但有碰撞的可能性(在你的情况下,我可以保证不会发生)。但是,碰撞的几率是真的是很小。
要它放入角度来看,碰撞是1/2^128
发生,这就是:
1
---------------------------------------------------
340,282,366,920,938,463,463,374,607,431,768,211,456
而这小于一点点:
0.0000000000000000000000000000000000000293873 %
我相当务必”不会碰撞;)
感谢您的回答。不过,我不必担心攻击者强行冲突。我的问题只是关于“自然”碰撞的可能性。不管怎么说,还是要谢谢你。 – HCL 2011-04-13 21:20:12
通过设计具有指定名称和出生日期的两个人来发起SHA-1冲突攻击,以便他们的哈希碰撞将是**非常令人印象深刻的**专长。 – 2011-04-14 09:35:27
散列冲突是不可避免的。然而,小的可能是碰撞的机会,如果你真的想100%识别,你不应该只依靠散列。
如果使用散列来加速数据库搜索,则不需要使用SHA256。使用你的系统具有最小尺寸的任何散列函数(MySQL的MD5(),或者如果你的数据库不是那么大,你甚至可以尝试CRC32)。只是当你查询表,你需要提供你通过搜索所有条件:
SELECT * FROM用户WHERE哈希=“AABBCCDD”和名字=“保尔”和姓=“索科洛夫”
数据库维护值,即index cardinality。这是衡量给定索引数据的唯一性。因此,您可以使用散列字段将想要的字段编入索引,并且数据库将自己为查询选择最具选择性的索引。添加附加条件不会对性能造成负面影响,因为大多数数据库在从表中选择数据时只能使用一个索引,并且它们将选择基数值最大的那个。
数据库将需要首先选择与索引匹配的所有行,然后扫描它们以放弃不符合其他条件的行。
如果你不能使用我描述的方法,那么我认为即使MD5碰撞概率在人名数据库上也会出现很低的情况。
P.S.我希望你知道,你知道“一个人的姓,名和出生日期的组合”不足以100%识别一个人吗?而且,这种组合将会比一些哈希碰撞更快。
+1这与这个特定任务不相关/适用,但感谢索引基数的信息。很高兴知道,我没有意识到这一点。 – HCL 2011-04-13 21:15:33
姓名,名字和出生日期?名字应该是什么?名字+姓氏?或者是什么? – emzero 2011-04-13 20:47:41
SHA1或MD5应该可以正常搜索 – Elalfer 2011-04-13 20:48:36
@emzero:Last-name。我改变了这个问题。 – HCL 2011-04-13 20:49:03