不可逆的唯一标识符从字符串中生成

8
这个问题似乎很常见,但是我却找不到任何有帮助的解决方案...
我觉得我缺乏基本的哈希和加密知识。 问题
假设我有一个电话号码,作为ID使用(希望它是唯一的)。 但是我不想在公共接口中使用我的私人号码作为ID。 我需要的是一种解决方案,可以将字符串混淆一种方式,但仍保持唯一性,因此当其他人使用算法时,他将获得相同的ID。 解决方案(?)
是否有一种哈希算法,在输入不超过哈希输出长度的情况下保证唯一性,但仍然(几乎)不可能反转。 使用固定的公钥RSA加密呢?输出应该是唯一的,但攻击者必须破解单个密钥才能解密所有数字。听起来像个坏主意... 更新(根据答案)
显然我正在寻找一个具有低碰撞概率的密码哈希算法。 现在(我已经睡了一会儿并且)认真思考了一下还有一些事实:
  • 无论如何我都要处理碰撞。当我使用电话号码作为ID而没有进一步的验证时,任何人都可以声明“这是我的”。
  • 彩虹表将永远是一个问题。由于电话号码的数量可控且每个人都应该能够从电话号码生成哈希值(我甚至不能使用秘密盐)。我唯一的可能性是使用一种强大的算法和使彩虹表唯一的盐才行。

说了这么多,我可以决定使用哈希。这样,没有人可以立即确定使用的电话号码是哪个,除非对其进行攻击。这似乎就是整个问题的关键所在。


由于加密方法将是公开的,并且对于此示例,您的源字符串很短并且仅包含数字(甚至具有特定格式),因此彩虹表将成为您的克星。 - zsawyer
1个回答

8
你所需要的基本上是一个哈希算法(正如你的问题所述)。但棘手的地方在于以下两行:
  • "保证输入不超过哈希输出长度时唯一性"
  • "但仍然(几乎)不可能被反转"
根据输入长度,你可以通过几个循环和一些时间来证明唯一性(或非碰撞)。因此,对于你的电话号码示例,你可以轻松地证明所有SHA1哈希的电话号码不会发生碰撞。
如果您的输入空间很大,现代哈希函数(如SHA-1或SHA-3)具有非常低的碰撞概率(birthday problem),但并不保证不会发生碰撞。虽然人们一直在尝试找到SHA-1的碰撞,并且已经找到了,但我认为当前突破单个SHA1的成本是200万美元,这发生在一个名为HashClash的项目中。目前的建议是让人们转向SHA-3,在那里还没有检测到任何碰撞。(对于SHA-1的碰撞,我认为需要类似于2 ^ 51次操作才能找到,因此对于您的需求来说可能足够好)。

enter image description here

对于你的第二个问题,“无法被逆转”,你可以努力使某些计算变得不可行。但是,使用无限的时间,攻击者可以逆转任何哈希值。
这个链接是非加密当前哈希算法的优秀研究。不幸的是,你可能不能使用文章中提到的任何算法,因为你需要抵御逆转,所以你不想要一个快速的哈希算法。较慢的算法使计算更加困难。
假设攻击者知道160位SHA1哈希(或者你正在使用的任何哈希)是一个电话号码。在这种情况下,他很容易为每个可能的电话号码哈希值创建一个彩虹表。这对于任何哈希算法都是正确的。人们通常采取的方法是对原始短语进行Salt处理,以避免这种情况发生。这有助于使构建彩虹表变得不可行,因为Salt是秘密的,可能性很多。

哇,非常感谢您的出色和准确的回答(我喜欢SO!)。有很多有用的信息和事实让我重新思考我的实际想法。我会编辑我的问题。 - Knickedi
@Knickedi,如果你感兴趣的话,我找到了Jeff Atwood的这个链接,比我之前的回答更好。http://www.codinghorror.com/blog/2012/04/speed-hashing.html - Matt Johnson
2
非常有趣,感谢您的努力。安全是一个如此有趣和广泛的话题。但不知何故,你总觉得你最终会输掉 :-D - Knickedi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接