来自String的不可逆唯一ID

Kni*_*edi 7 string encryption hash unique

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

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

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

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

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

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

Mat*_*son 8

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

  • "当输入不超过散列输出长度时,保证唯一性"
  • "但仍然(几乎)无法逆转 "

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

如果您的输入空间很大,您可以放心,现代哈希函数(如SHA-1或SHA-3)的碰撞概率非常低(生日问题),但无法保证.尽管人们一直在努力寻找SHA-1的碰撞并找到它们,但我认为在一个名为HashClash的项目中,打破单个SHA1的当前成本是200万.目前,建议人们继续使用SHA-3,在那里没有检测到碰撞.(对于SHA-1的冲突,我认为需要2 ^ 51次操作才能找到,所以它可能足以满足您的需求).

在此输入图像描述

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

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

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

  • 很有趣,谢谢你的努力。安全是一个如此有趣和广泛的话题。但不知何故,你总是觉得无论如何你都会输:-D (2认同)