我有一个128位ID,我想要执行单向散列,但我不想为输入消息获得相同的摘要。有没有人知道sha-1或替代方案是否保证不会产生小于其输出摘要大小的消息集的冲突?这至少在理论上是可能的......
我还考虑过使用RSA,丢弃私钥给我一个单向加密,但我需要将结果存储在一个32 char数据库字段中,而我可用的加密方案不会产生任何小的够了。
欢迎任何关于产生原始值的确定性,不可逆和无碰撞变换的方法的建议。
答案 0 :(得分:7)
加密哈希值给出了给定输入的随机数的非常好的近似值。那么在你得到相同的160位之前,你需要在一个房间里有多少随机哈希?关于平方根(免责声明:我不是统计学家)。所以你应该期望看到大约80位的冲突。
我猜实际意味着你应该知道宇宙射线何时会比碰撞更大。
答案 1 :(得分:5)
如果要计算128位到128位的秘密置换,一个简单的解决方案是使用带有固定密钥的AES等128位分组密码。当然,你必须能够永远保持密钥的秘密,否则你什么都没有。
答案 2 :(得分:3)
您的ID是唯一且128位。
您的评论说明您无法按原样使用该ID。
您需要它是唯一的,而不仅仅是可能唯一。因此,您不能使用哈希。
你不能同时拥有这两个世界 - 你不能拥有不可逆的1:1映射 。这是不可能的。
加密 - 一种双向操作,因此会有无冲突 - 带有密钥的ID会使ID反转以确定其原始值 非常难 强>
AES具有128位的良好块长度,可从128位输入生成128位输出,比旧算法(!)更快,并且可广泛用于大多数平台和语言。我建议您使用AES作为您的目的。
答案 3 :(得分:2)
有没有人知道sha-1还是an 替代方案,保证不会 产生碰撞
散列函数的设计不会产生碰撞,但没有任何“保证”。相反,保证会发生冲突,因为消息空间实际上是无限期的,而你可能存在有限数量的哈希值。
然而,SHA-1已经被证明是防碰撞,这是你所能想到的最好的。
答案 4 :(得分:1)
我不知道哪些哈希函数可以避免冲突,但是如果你在这里找不到答案,维基百科上的一个好的起点可能是Perfect Hash Function。从该页面:
集合S的完美散列函数是 一个映射不同的哈希函数 S中的元素为不同的整数, 没有碰撞。
有许多指向该页面的更多信息的链接,您可能会发现它们很有用。
话虽如此,你能说出为什么你需要一个完美的函数吗?可能有其他方法可以在不需要该属性的情况下完成您想要的任务,而且此处的某人可能会提出建议。
答案 5 :(得分:1)
对于足够大的位大小,我认为离散取幂是1:1的函数,但逆转在计算上是不可行的。我不确定如何需要“大”。代码实现缓慢(但在概念上可理解):
unsigned long spin_once(unsigned long dat) { if (dat & 1) return (dat >> 1); return (dat >> 1) ^ SomeMagicNumber; } unsigned long hash(unsigned long dat) { unsigned long i,ret; if (dat == 0xFFFFFFFF) return 0; ret = 1; for (i=0; i < dat; i++) ret = spin_once(ret); }
这个程序需要花费数十亿步才能计算出许多dat值的散列值,但是使用更复杂的代码,可以在合理的时间内完成这项工作。当然,32位散列在加密方面毫无价值,但该方法可以很容易地扩展到任何大小。
答案 6 :(得分:0)
不能(通常)从哈希值中恢复原始数据的单向哈希值?那么为什么有人会设计一个哈希函数来避免小输入的冲突呢?
相反,看起来你想要隐藏数据,这对某些目的来说很好。如果使用公钥加密是不切实际的,那么您也可以编写自己的函数。
答案 7 :(得分:0)
根据这篇文章http://www.debian-administration.org/users/dkg/weblog/48,
美国政府联邦机构已经 旨在停止对所有人的依赖 截至2010年底的SHA-1
然而,据我所知,尚未发现任何碰撞,这意味着,即使是那些努力尝试的人也没有发现任何碰撞。因此,假设不发生冲突(如果您不处理高安全性数据)似乎是合理的
答案 8 :(得分:0)
哈希“不太可能”产生任何重复,但没有保证。在 另一方面,任何对称加密方案都会产生128位的128位, 并保证不重复。
另一方面,如果你依赖于独特的哈希,我的直觉就是你 做错了。例如,如果您使用哈希来模糊密码,那么就是您 必须要小心,不要将散列密码作为事实上的密码。