来自String的不可逆唯一ID

时间:2013-06-01 23:38:33

标签: string encryption hash unique

这个问题听起来很常见,但不知怎的,我找不到能帮助我的东西...
我觉得我缺乏基本的哈希和加密知识。

问题
假设我有一个电话号码(希望是唯一的)用作ID 但我不想在公共接口中使用我的私人号码作为ID 我需要的是一种解决方案,它以一种方式混淆字符串,但仍然保持唯一性,所以当其他人使用算法时,他将获得相同的ID。

解决方案(?)
当输入没有超过散列输出长度但仍然(几乎)无法反转时,是否存在散列算法以保证唯一性。
使用固定的公钥RSA加密怎么样?输出应该是唯一的,但攻击者必须打破一个密钥才能解密所有数字。听起来不错......

更新(根据回答)
显然,我正在寻找具有低冲突概率的加密哈希算法 现在(我已经睡了一觉)认为通过我可以想到的更多事实:

  • 无论如何我必须处理碰撞。当我使用电话号码作为身份证而无需进一步验证时,任何人都可以说“这是我的”。
  • 彩虹表总是一个问题。因为有一个可管理的电话号码,每个人都应该能够从电话号码生成哈希(我甚至不能使用秘密盐) 。我唯一的可能是使用强化算法和盐,这使得彩虹表我认为是独一无二的。

话虽如此:我可以决定使用哈希。这样,没有人可以立即(不攻击它)使用哪个电话号码。这似乎是重点。

1 个答案:

答案 0 :(得分:8)

你基本上想要的是哈希算法(正如你的问题所述)。但它变得棘手的是两条线:

  • “保证输入不超过散列输出长度时的唯一性”
  • “但仍然(几乎)无法撤销

根据输入长度,您可以使用一些for循环和一些时间来证明自己的唯一性(或非碰撞)。因此,对于您的电话号码示例,您可以轻松证明SHA1的所有电话号码都不会发生冲突。

如果您的输入空间很大,您可以放心,现代哈希函数(如SHA-1或SHA-3)的碰撞概率非常低(birthday problem),但无法保证。虽然人们已经尝试了很长时间来找到SHA-1的碰撞并找到它们,但我认为在一个名为HashClash的项目中,打破单个SHA1的当前成本是200万。目前,建议人们继续前往SHA-3,此时未发现任何碰撞。 (对于SHA-1的冲突,我认为需要2 ^ 51个操作来查找,因此根据您的需要可能good enough。)

enter image description here

对于你问题的第二部分,“仍然无法逆转”。你可以努力使计算不可行的东西。但是无限时间攻击者可以反转任何哈希值。

此链接是对非加密current hash algorithms的精彩检查。不幸的是,您可能无法使用文章中提到的任何这些,因为您需要抵制逆转,因此您不需要快速哈希算法。较慢的算法使计算机更不可行。

让我们假设攻击者知道160位SHA1哈希(或您正在使用的任何哈希)是一个电话号码。在这种情况下,他不难为每个可能的电话号码哈希值创建rainbow table。对于任何散列算法都是如此。人们通常采取的措施是Salt原始短语。这有助于使建造彩虹表不可行,因为盐是秘密的,并且可能性的数量巨大。