【问题标题】:Which algorithm for hashing name, firstName and birth-date of a person哪种算法用于散列一个人的姓名、名字和出生日期
【发布时间】:2011-04-13 20:44:13
【问题描述】:

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

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

【问题讨论】:

  • 姓名、名字和出生日期?名字应该是什么?名字+姓氏?还是什么?
  • SHA1 或 MD5 应该可以正常搜索
  • @emzero:姓氏。我已经改变了问题。

标签: cryptography hash anonymize


【解决方案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 BobJohn DoeBob在同一天出生一样。我不知道数字名称,所以我认为这将阻止像这样的冲突;)

但如果这是一个大数据库,我会尝试 MD5。它更快,但有可能发生碰撞(在你的情况下,我可以保证不会发生碰撞)。然而,发生碰撞的可能性真的很小。

从这个角度来看,碰撞是1 / 2^128 的发生,即:

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

这比:

0.0000000000000000000000000000000000000293873 %

很漂亮确定你不会发生碰撞;)

【讨论】:

  • +1 将 DOB 放在中间是个好主意。这是一个大数据库。速度(散列)不是问题。我唯一害怕的是碰撞。最好使用 SHA-256?
  • 大,我的意思是大于2^128。这大约是10^38,是人口规模的10^31 倍。我怀疑你会得到一个;)
【解决方案2】:

哈希冲突是不可避免的。无论发生冲突的可能性多么小,如果您真的想要 100% 识别,您不应该只依赖哈希。

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

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

数据库维护一个值,称为index cardinality。它是给定索引上数据唯一性的度量。因此,您可以将所需的字段与哈希字段一起索引,并且数据库将为查询自己选择最具选择性的索引。添加附加条件不会对性能产生负面影响,因为大多数数据库在从表中选择数据时只能使用一个索引,并且它们会选择具有最大基数值的那个。

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

如果你不能使用我描述的方法,那么我认为在人名数据库上发生MD5冲突的概率非常低。

附:我希望你知道,你知道“一个人的姓氏、名字和出生日期的组合”不足以100%识别一个人吗?并且这种组合将比一些哈希冲突更快地匹配。

【讨论】:

  • +1 这与此特定任务无关/不适用,但感谢索引基数的信息。很高兴知道,我没有意识到这一点。
【解决方案3】:

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

Understanding sha-1 collision weakness

如果您有安全问题,我会考虑使用 SHA-256。

【讨论】:

  • 感谢您的回答。但是我不必担心攻击者强制碰撞。我的问题只是关于“自然”碰撞的可能性。还是谢谢。
  • 通过设计具有指定姓名和出生日期的两个人来发起 SHA-1 碰撞攻击,以便他们的哈希值发生碰撞将是一个非常令人印象深刻的壮举。
猜你喜欢
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2023-01-11
相关资源
最近更新 更多