哈希函数绕过?

时间:2012-03-03 10:39:37

标签: security networking hash

我想知道下一件事是否可能:

当我们使用哈希函数加密登录密码时,无法解密哈希以查找原始密码。

但是有可能找到该哈希值并将其直接发送到服务器,而不是输入哈希函数将加密到哈希值然后发送它的密码吗?

5 个答案:

答案 0 :(得分:3)

当您在服务器端收到密码时,在将其与存储的哈希密码进行比较之前,您将始终必须应用相同的哈希函数。话虽如此,将散列密码发送到服务器将不起作用:

hash(hash(password)) != hash(password)

换句话说,如果这是伪代码中的服务器端密码检查功能:

function check(password) {
  return hash(password) == storedPassword;
}

storedPassword以前计算为hash(password),然后调用

check(storedPassword)

将始终返回false

答案 1 :(得分:1)

如果您进行服务器端哈希,则不应该这样做。

如果您发送salt+hash(pass, salt)服务器计算hash(pass, salt),显然与salt+hash(hash(pass, salt), salt)不一致,则服务器现在存储salt+hash(pass, salt),并且登录失败。

只有在使用客户端发生散列的方案时,您的攻击才有效。即你希望将哈希值发送到服务器以“避免以明文形式发送密码”。我见过很多初学者都提出这样的方案,但是他们因为你注意到的原因而感到厌烦。

答案 2 :(得分:1)

另请参阅http://en.wikipedia.org/wiki/Pass_the_hash了解将哈希值直接发送到服务器的技术。

答案 3 :(得分:0)

散列函数并不真正加密,它散列。它是单向函数,这意味着,有了哈希,我们无法确定我们使用的输入,来创建哈希。作为一个理解的例子(它确实没有反映哈希的现实,它被简化)

想象一下删除每个第3个字母的函数,并将其他字母替换为其成员(a-> b,b-> c,z-> a)。

想象一下输入

Hello World!

然后输出

f('Hello World!') = IfmpXpme

如你所见,字母' l' ' ' ' R' '!'被删除了。现在因为它们被删除了,即使知道了这个功能,你也无法重新创建输入。

因此获取输入的唯一方法是尝试所有可能的输入字符串。

因此,哈希无法解密。 散列函数是散列,而不是enrypting。 (好吧,如果我们闭上眼睛,哈希可能是特殊的情况......)

答案 4 :(得分:0)

我对哈希函数绕过的想法是存储原始文件的副本,并具有修改副本的代码。制作原始的哈希值,然后找到一种方法将该哈希值发送给主机,有效地将修改后的消息伪装成原始消息!