sha-1是否会为小于160位的输入消息产生冲突?

时间:2010-07-01 13:42:50

标签: java hash rsa sha1 cryptographic-hash-function

我有一个128位ID,我想要执行单向散列,但我不想为输入消息获得相同的摘要。有没有人知道sha-1或替代方案是否保证不会产生小于其输出摘要大小的消息集的冲突?这至少在理论上是可能的......

我还考虑过使用RSA,丢弃私钥给我一个单向加密,但我需要将结果存储在一个32 char数据库字段中,而我可用的加密方案不会产生任何小的够了。

欢迎任何关于产生原始值的确定性,不可逆和无碰撞变换的方法的建议。

9 个答案:

答案 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位, 并保证不重复。

另一方面,如果你依赖于独特的哈希,我的直觉就是你 做错了。例如,如果您使用哈希来模糊密码,那么就是您 必须要小心,不要将散列密码作为事实上的密码。