7

这个问题听起来很普遍,但不知何故我找不到可以帮助我的东西......
我觉得我缺乏基本的散列和加密知识。

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

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

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

  • 无论如何,我必须处理碰撞。当我在没有进一步验证的情况下使用电话号码作为 ID 时,任何人都可以说“这是我的”。
  • 彩虹桌永远是个问题。由于电话号码的数量是可控的,并且每个人都应该能够从电话号码生成哈希(我什至不能使用秘密盐)。我唯一的可能性是使用强化算法和盐,这使得彩虹表我认为是独一无二的。

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

4

1 回答 1

8

您基本上想要的是散列算法(如您的问题所述)。但它变得棘手的是两条线:

  • “当输入不超过散列输出长度时保证唯一性”
  • “但仍然(几乎)不可能逆转

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

如果您的输入空间很大,您可以放心,现代散列函数(如 SHA-1 或 SHA-3)发生冲突的概率非常低(生日问题),但不能保证。尽管人们长期以来一直在努力寻找SHA-1的冲突并找到了它们,但我认为目前在一个名为 HashClash 的项目中破坏单个 SHA1 的成本是 200 万。目前,建议人们继续使用未检测到冲突的SHA-3 。(我认为 SHA-1 的冲突需要 2^51 次操作才能找到,因此它可能足以满足您的需求)。

在此处输入图像描述

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

此链接是对非加密当前哈希算法的出色检查。不幸的是,您可能无法使用本文中提到的任何这些,因为您需要抵抗反转,因此您不想要快速散列算法。较慢的算法使事情在计算上更加不可行。

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

于 2013-06-02T00:46:14.680 回答