我采用十六进制(64十六进制)的SHA256哈希输出,通过接受其他字符使其为32十六进制或128位,并将其格式化为UUID字符串,从而对其进行后续处理。
这不是用于安全目的,主要是作为创建确定性UUID的一种方式。我从几个来源中了解到,与MD5相比,将MD5截断为128位仍然具有更强的抗碰撞能力。
我的问题是,使用所有其他十六进制而不是截断SHA256哈希输出的前32次十六进制是否会以任何方式影响碰撞概率?
我的直觉是,它根本不应该影响碰撞概率,但我所读过的所有源都只讨论了SHA256散列的前n个字符的截断,而没有讨论其他字符的子序列。
作为注意,我最近还了解到,UUIDv5使用SHA1创建哈希,然后截断前16个字节以创建可重复的UUID。因此,我认为我使用的方法应该产生类似的碰撞安全。
就我的目的而言,最多有10亿份独特的记录。
使用下列意外碰撞概率的近似公式:
k^2/2n where:
k is the number of records (1 billion)
n is the number of total possible hashes (2^128).
碰撞概率为:1.47x10^-21。这是足够低,我觉得安全,不会发生碰撞。
有人能为我确认或否认这一点吗?
发布于 2022-12-27 20:11:36
你可以使用SHA-256的256位输出中的任意128位,每一位有50%的机会成为0或1。仅仅截断被认为是最佳实践,因为你所做的看起来“聪明”,这是一种反模式。例如,参见关于截断HMAC的RFC中输出的部分。
我担心您的“唯一UUID”可能被映射回它们的原始值,因为没有那么多原始值。如果它们只是顺序整数之类的,那么做起来就很简单了。也许用一个秘密密钥而不是直接散列的HMAC?或者回顾一下整个系统的设计而不是这个小部分?
https://security.stackexchange.com/questions/267330
复制相似问题