原像抗性:对于基本上所有预先指定的输出,找到任何哈希到该输出的输入在计算上是不可行的,即,很难找到任何前像素x给定a " Y"这样h(x)= y。
第二原像抗性:找到任何与指定输入具有相同输出的第二输入在计算上是不可行的,即给定x,很难找到第二个原像X' ≠x使得h(x)= h(x')。
然而,我不明白。不 h(x')(其中输入 x' )生成 y (输出),然后与相同的 h(x)?
进行比较说,我有一个字符串"示例"。它产生MD5" 1a79a4d60de6718e8e5b326e338ae533"。与使用MD5相比,为什么只使用MD5(示例)?
答案 0 :(得分:4)
理想的散列就像取一个人的指纹,它是独一无二的,它是不可逆的(你不能仅仅从指纹中取回整个人)它可以作为一个简短的标识符对于给定的人。
如果我们将您引入的一些术语带入我们的类比中,我们会发现 preimage resistance 是指散列函数不可逆的能力。想象一下,如果你能从指纹中产生一个人的形象,除了真的很酷,这也可能是非常危险的。出于同样的原因,必须进行散列函数,以便攻击者无法找到生成散列的原始消息。从这个意义上说,哈希函数是单向,因为消息会生成哈希值,而不是则反过来。
第二个原像抗性是指给定哈希函数的唯一能力。如果任何数量的个人可以共享相同的指纹,法医指纹识别将是一个非常浪费的时间(现在让我们排除同卵双胞胎。编辑:请参阅下面的Det评论)。如果使用给定的哈希来验证数据损坏,那么如果腐败数据很有可能产生相同的哈希值,则毫无意义。
同时具有preimage抗性和第二个preimage抗性哈希函数采用几个特征来帮助它们。散列函数非常常见的一个特性是给定输入与输出无关。单个位更改可以生成一个散列,该散列完全没有与原始输入的散列共享的字节。因此,在消息身份验证中通常使用良好的哈希函数。
虽然你正确地比较原始信息在功能上等同于比较哈希,但在大多数情况下它根本不可行。例如:
如果甲方希望可靠地向乙方发送消息,则甲方需要就转移期间检测数据损坏的方案达成一致意见。注意:在A方发送之前,B方没有原始消息。
可能的转移方案可以是将消息转发两次,使得B方可以验证第二消息是否等于第一消息。这样做的问题是,在同一个地方有可能发生两次损坏(以及明显更高的带宽)。这只能通过发送消息更多次来减少,从而导致严重的带宽成本。
作为替代方案,A方可以将他/她的长消息传递给散列函数并生成他/她发送给B方的短散列,然后是原始消息。然后,B方可以接收收到的消息并将其传递给散列函数并匹配散列。如果消息或散列在传输过程中甚至被一个位损坏,则由于第二个preimage阻抗(没有两个明文应该具有相同的散列),结果散列将不匹配。
在这种情况下,如果邮件在传输过程中被加密但是哈希是在加密之前进行的(这是否合适是另一种讨论),那么这种情况下的Preimage Resistance会很有用。如果哈希是可逆的,那么窃听者可以拦截哈希并反向查找原始邮件。
所有哈希函数都不相等,这就是为什么在选择使用哪些,哪些是安全的以及哪些should be deprecated and replaced时考虑它们的前像像阻力/第二前像像阻力很重要的原因。
答案 1 :(得分:1)
你了解原像和第二原像抗性吗?它表示哈希函数的输出是唯一的,至少在理论上是这样。从哈希中获取原始字符串是“计算上”不可行的。虽然可能(蛮力)但是占用了大量的时间和资源。
现在,散列函数的输出和字符串本身是不同的。例如,考虑一个带有仪表板的网站。您在注册时提供user_id和密码。如果网站将您的密码存储在其数据库中,则黑客可以访问该密码。他可以访问您的帐户。但是,如果存储了密码的哈希值,即使他设法破解服务器,该哈希对他也毫无用处。因为,如果没有您的密码,他将无法访问您的帐户,并且从哈希中获取您的密码在计算上是不可行的(前映像素阻力)。将md5(yourpassword)与存储在db中的哈希进行比较是不同的。每次输入密码时,都会使用sampe散列函数对其进行散列,并与现有散列进行比较。根据第二张图像抗性,如果输入的密码不正确,则哈希值将不匹配。
散列的另一个例子是版本控制或源代码控制机制。要跟踪文件中的更改,请使用散列。它们散列整个文件并保留它。如果修改了文件,则其哈希值会相应更改。
这些都是解释你问的内容的例子。