String 来自字符串的不可逆唯一ID

String 来自字符串的不可逆唯一ID,string,encryption,hash,unique,String,Encryption,Hash,Unique,这个问题听起来很常见,但不知何故,我找不到什么能帮我解决这个问题的方法…… 我觉得我缺少基本的哈希和加密知识 问题 假设我有一个电话号码(希望是唯一的)用作ID。 但我不想在公共接口中将我的私人号码用作ID。 我需要的是一个解决方案,它以一种方式混淆字符串,但仍然保持唯一性,这样当其他人使用该算法时,他将获得相同的ID 解决方案(?) 当输入不超过哈希输出长度,但仍然(几乎)不可能反转时,是否有一种哈希算法可以保证唯一性。 使用固定公钥RSA加密怎么样?输出应该是唯一的,但攻击者必须破解单个密钥

这个问题听起来很常见,但不知何故,我找不到什么能帮我解决这个问题的方法……
我觉得我缺少基本的哈希和加密知识

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

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

更新(基于答案)
显然,我正在寻找一种冲突概率较低的加密哈希算法。
现在(我已经睡了一会儿)想,通过这里我可以想到更多的事实:

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

这么说吧:我可以决定使用散列。这样,没有人可以立即(不攻击它)知道使用了哪个电话号码。这似乎是重点所在

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

  • “确保输入不超过哈希输出长度时的唯一性”
  • “但仍然(几乎)不可能逆转”
根据输入长度,您可以通过一些for循环和一些时间来证明自己的唯一性(或无冲突)。因此,对于您的电话号码示例,您可以很容易地证明SHA1的所有电话号码没有冲突

如果您的输入空间很大,您可以放心,现代散列函数(如SHA-1或SHA-3)的冲突概率很低(),但没有保证。虽然人们已经尝试了很长一段时间来寻找碰撞,并且已经找到了它们,但我认为在一个名为HashClash的项目中,目前打破一个SHA1的成本是200万。目前,建议人们继续前往未检测到碰撞的地方。(我认为SHA-1的碰撞需要2^51操作才能找到,所以这可能是为了满足您的需要)

关于你问题的第二部分,“仍然无法逆转”。你可以努力使某些东西在计算上不可行。但攻击者可以无限期地反转任何散列

此链接是对非加密的优秀检查。不幸的是,您可能无法使用本文中提到的任何一个,因为您需要抵抗反转,所以您不需要快速哈希算法。较慢的算法使事情在计算上更加不可行

让我们假设攻击者知道160位SHA1散列(或您正在使用的任何散列)是一个电话号码。在这种情况下,他不难为每个可能的电话号码创建一个哈希值。对于任何哈希算法都是如此。人们通常会避免使用这个短语。这有助于使建造彩虹桌变得不可行,因为盐是秘密的,可能性很大


因为加密方法是公开的,在本例中,源字符串很短,只有数字(甚至是特定格式)。彩虹桌将成为你的死敌。哇。非常感谢你伟大而准确的回答(我非常喜欢!)。有很多有用的信息和事实让我重新思考我的实际想法。我将编辑我的问题。@Knickedi我从Jeff Atwood那里找到了这个链接,如果你感兴趣的话,这个链接比我上面的答案要好。很有趣,谢谢你的努力。安全是一个如此有趣和广泛的话题。但不知何故,你总觉得自己会输