字符串中不可逆的唯一ID字符串、中不、ID

2023-09-04 01:30:41 作者:深情若是桩悲剧

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

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

C语言问题,编写一个函数,判定一个字符在一个字符串中出现的次数,如果字符串不出现,则返回值0.

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

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

无论如何我都要处理冲突。当我使用电话号码作为ID而没有进一步验证时,任何人都可能会说"这是我的"。 彩虹表将始终是一个问题。因为电话号码的数量是可管理的,并且每个人都应该能够从电话号码生成散列(我甚至不能使用秘密盐)。我唯一的可能是使用密集的算法和盐,这让彩虹表变得独特,我想。

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

推荐答案

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

"保证输入不超过哈希输出长度时的唯一性" "但仍(几乎)无法撤消"

根据输入长度,您可以使用几个for循环和一些时间来证明自己的唯一性(或无冲突)。因此,对于您的电话号码示例,您可以很容易地证明SHA1 HAS的所有电话号码不会冲突。

如果您输入空间很大,您可以放心地认为现代散列函数(如SHA-1或SHA-3)的冲突概率非常低([3-0]),但没有保证。尽管人们花了很长时间来寻找SHA-1的冲突并找到了它们,但我认为,在一个名为HashClash的项目中,打破单个SHA1的成本目前为200万美元。目前,建议用户转移到未检测到冲突的SHA-3。(SHA-1的碰撞我认为需要大约2^51次操作才能找到,因此它可能是good enough满足您的需要)。

对于你问题的第二部分,"仍然不可能逆转"。你可以努力让某些东西在计算上变得不可行。但在无限时间内,攻击者可以反转任何哈希。

此链接是对非加密current hash algorithms的极好检查。不幸的是,您可能不能使用本文中提到的任何一种方法,因为您需要抵抗反向操作,所以您不需要快速的散列算法。较慢的算法使事情在计算上更加不可行。

假设攻击者知道160位的SHA1散列(或您正在使用的任何散列)是电话号码。在这种情况下,对于他来说,为每个可能的电话号码创建一个rainbow table散列值并不困难。这对于任何散列算法都是正确的。人们通常会做的避免这种情况的方法是Salt原始短语。这使得建造彩虹桌变得不可行,因为盐分是秘密的,而且可能性很大。

Current Cyrptographic hash functions Good Blog post on coding horror on Hashing with Salt Another Blog Post
 
精彩推荐
图片推荐