2011-04-13 30 views
2

我必须将姓氏,姓氏和出生日期的组合保存为散列。这个散列稍后用于搜索具有完全相同属性的同一个人。 我的问题是,如果SHA-1是一个有意义的算法。散列名称,姓氏和出生日期的算法

据我了解SHA-1,两个不同的人(具有不同的属性)几乎不可能获得相同的散列值。这是正确的吗?

+0

姓名,名字和出生日期?名字应该是什么?名字+姓氏?或者是什么? – emzero 2011-04-13 20:47:41

+0

SHA1或MD5应该可以正常搜索 – Elalfer 2011-04-13 20:48:36

+0

@emzero:Last-name。我改变了这个问题。 – HCL 2011-04-13 20:49:03

回答

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 % 

相当务必”不会碰撞;)

+0

+1把DOB放在中间的好主意。这是一个很大的数据库。速度(哈希)不是问题。我唯一担心的是碰撞。最好使用SHA-256? – HCL 2011-04-13 20:54:47

+0

大,我的意思是比'2^128'大。大约是10^38,比人口数量大10^31倍。我怀疑你会得到一个;) – Blender 2011-04-13 20:58:33

+0

看到我的编辑。我添加了一些关于'MD5'的数字。 – Blender 2011-04-13 21:09:27

0

如果你关心碰撞,这里有一个很好的讨论:

Understanding sha-1 collision weakness

如果有安全问题,我认为SHA-256来代替。

+0

感谢您的回答。不过,我不必担心攻击者强行冲突。我的问题只是关于“自然”碰撞的可能性。不管怎么说,还是要谢谢你。 – HCL 2011-04-13 21:20:12

+0

通过设计具有指定名称和出生日期的两个人来发起SHA-1冲突攻击,以便他们的哈希碰撞将是**非常令人印象深刻的**专长。 – 2011-04-14 09:35:27

1

散列冲突是不可避免的。然而,小的可能是碰撞的机会,如果你真的想100%识别,你不应该只依靠散列。

如果使用散列来加速数据库搜索,则不需要使用SHA256。使用你的系统具有最小尺寸的任何散列函数(MySQL的MD5(),或者如果你的数据库不是那么大,你甚至可以尝试CRC32)。只是当你查询表,你需要提供你通过搜索所有条件:

SELECT * FROM用户WHERE哈希=“AABBCCDD”和名字=“保尔”和姓=“索科洛夫”

数据库维护值,即index cardinality。这是衡量给定索引数据的唯一性。因此,您可以使用散列字段将想要的字段编入索引,并且数据库将自己为查询选择最具选择性的索引。添加附加条件不会对性能造成负面影响,因为大多数数据库在从表中选择数据时只能使用一个索引,并且它们将选择基数值最大的那个。

数据库将需要首先选择与索引匹配的所有行,然后扫描它们以放弃不符合其他条件的行。

如果你不能使用我描述的方法,那么我认为即使MD5碰撞概率在人名数据库上也会出现很低的情况。

P.S.我希望你知道,你知道“一个人的姓,名和出生日期的组合”不足以100%识别一个人吗?而且,这种组合将会比一些哈希碰撞更快。

+0

+1这与这个特定任务不相关/适用,但感谢索引基数的信息。很高兴知道,我没有意识到这一点。 – HCL 2011-04-13 21:15:33