【问题标题】:Difference between preimage resistance and second-preimage resistance原像电阻和二次原像电阻的区别
【发布时间】:2018-07-22 14:20:40
【问题描述】:

Wikipedia 说:

  • 原像阻力:对于基本上所有预先指定的输出,要找到任何散列到该输出的输入在计算上是不可行的,即,很难找到任何原像 x 给定 a "y" 使得 h(x) = y。

  • second-preimage resistance:要找到与指定输入具有相同输出的任何第二个输入在计算上是不可行的,即,给定 x,很难找到第二个原像x' ≠ x 使得 h(x) = h(x')。

然而,我不明白。 h(x′)(其中 x' 是输入)生成 y(输出) ,然后将其与相同的 h(x)?

进行比较

说,我有一个字符串“示例”。它生成 MD5“1a79a4d60de6718e8e5b326e338ae533”。为什么只使用 MD5 与使用 MD5 不同(示例)?

【问题讨论】:

  • 你在质疑散列的目的吗?我的意思是为什么使用散列而不是纯字符串。是这样的吗?
  • @elf 也许我完全误解了这个问题,但不是比较“MD5(example)”(带参数的函数)和“1a79a4d60de6718e8e5b326e338ae533”(结果)是同一件事吗?
  • 不,它们不是一回事。我将在下面用一个例子来解释
  • 我投票结束这个问题,因为它是关于cryptography 并且与编程无关。

标签: hash cryptography


【解决方案1】:

理想的散列就像取一个人的指纹,它是唯一的,它是不可逆的(你不能仅仅从指纹中得到整个人),它可以作为一个简短的标识符用于给定的人。

如果我们将您引入的一些术语带入我们的类比中,我们会看到 原像阻力 是指哈希函数不可逆的能力。想象一下,如果你可以从他们的指纹中生成一个完整的人的肖像,除了非常酷之外,这也可能非常危险。出于同样的原因,必须制作散列函数,以便攻击者无法找到生成散列的原始消息。从这个意义上说,哈希函数是单向,因为消息生成哈希,而不是反过来。

第二原像抗性是指给定哈希函数的唯一性。如果任何数量的人可以共享相同的指纹,法医指纹识别将是一种严重的浪费时间(让我们暂时排除同卵双胞胎。编辑:请参阅下面的 Det 评论)。如果使用给定的哈希来验证数据是否损坏,那么如果损坏的数据很有可能生成相同的哈希,那将毫无意义。

同时具有原像抗性和第二原像抗性哈希函数采用了几个特性来帮助它们。哈希函数非常常见的一个特征是给定的输入与输出没有对应关系。单个位更改可以产生一个与原始输入的散列完全没有字节共享的散列。出于这个原因,一个好的散列函数通常用于消息认证。

虽然您是对的,直接比较原始消息在功能上等同于比较哈希值,但在大多数情况下根本不可行。例如:

如果甲方想要可靠地向乙方发送消息,甲方/乙方需要就在传输过程中检测数据损坏的方案达成一致。注意:在甲方发送之前,乙方没有原始消息。

一种可能的传输方案可能是将消息传输两次,以便 B 方可以验证第二条消息是否等于第一条消息。这样做的问题是有可能在同一个地方发生两次损坏(以及显着更高的带宽)。这只能通过更多次发送消息来减少,从而产生严重的带宽成本。

作为替代方案,A 方可以将他/她的长消息传递到一个散列函数中,并生成一个他/她发送给 B 方的短散列,然后是原始消息。然后乙方可以将收到的消息传递给散列函数并匹配散列。如果消息或散列在传输过程中被损坏,即使是单个位,生成的散列也不会匹配,这要归功于第二个原像阻力(没有两个明文应该具有相同的散列)。

如果消息在传输过程中被加密但哈希是在加密之前获取的,那么在这种情况下,原像抵抗将很有用(这是否合适是另一个讨论)。如果哈希是可逆的,窃听者可以拦截哈希并反向找到原始消息。

所有散列函数都不相等,这就是为什么在选择使用哪些、哪些是安全的以及哪些should be deprecated and replaced时考虑它们的原像抗性/第二原像抗性很重要。

【讨论】:

  • 大声笑,就像一个人的指纹......散列不是唯一的(否则你会得到世界上最先进的压缩技术)。尽管如此,对于大多数已知单词来说,哈希值都是已知的。值得庆幸的是,网上有多种服务可以“反向”散列。已知的给出即时结果,未知的被添加到未知匹配列表中。
  • @GitaarLAB 由于散列函数和输出大小的限制,散列并不是唯一的。即使它是完全独特的,它也不是一种压缩技术,因为它是不可逆的。与第二个原像抗性的整个处理为您提供了对散列如何唯一性的估计。
  • 对此,我同意。但这与您的开场白不同 Hashing is like taking the fingerprint of a person, it is unique, it is non-reversible (you can't get the whole person back just from the fingerprint) and it can serve as a short and simple identifier for the given person. 如果它 唯一的,那么您将有一个索引号到 any 可以想象的文件(将存储在无限数据库,您随后可以从云中下载任何可以想象的文件,只需通过它的哈希)。
  • @GitaarLAB 介绍中谈到了一个理想的散列,而主体和结论状态散列函数并不那么理想。基于哈希的索引是一件事,并且已在各种设置中使用(查看 git 的提交索引)。这些设置依赖于输入快照的给定哈希的唯一性。无论如何,大多数体面的安全哈希函数都被视为有效唯一。我在介绍中添加了理想这个词,以澄清任何误解。
  • 顺便说一句,除了绝妙的解释之外,还有一个笑话“让我们暂时排除同卵双胞胎”,但来自Wikipedia:Fingerprint#Latent detection“[e ]即使是同卵双胞胎(共享 DNA)也没有相同的指纹”.
【解决方案2】:

你了解原像和第二原像抗性吗?它说散列函数的输出是唯一的,至少在理论上是这样。从散列中获取原始字符串是“计算上”不可行的。虽然这是可能的(蛮力),但会占用大量时间和资源。

现在,哈希函数的输出和字符串本身是不同的。例如,考虑一个带有仪表板的网站。您在注册时提供您的 user_id 和密码。如果网站将您的密码存储在他们的数据库中,黑客就可以访问它。他可以访问您的帐户。但是,如果存储了您密码的哈希值,即使他设法破解了服务器,该哈希值对他也毫无用处。因为,如果没有您的密码,他就无法访问您的帐户,并且从哈希(原像抗性)中获取您的密码在计算上是不可行的。将 md5 (yourpassword) 与存储在数据库中的哈希值进行比较是不同的。每次输入密码时,都会使用 sampe 散列函数对其进行散列,并与现有散列进行比较。根据第二原像抵抗,如果您输入了错误的密码,则哈希将不匹配。

散列的另一个例子是版本控制或源代码控制机制。为了跟踪文件中的更改,使用了散列。他们散列整个文件并保留它。如果文件被修改,它的哈希值也会相应改变。

这些都是解释你问什么的例子。

【讨论】:

  • 最后我只需要+1 “知道了吗?”,但CPU Terminator 只是更深入地@ 987654322@,所以我同意了。
  • 我不得不承认,他花时间解释事情。我只是想获得一些代表来获得一些特权。现在我不再追求代表了。只是为了分享我所知道的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多