我想知道下一件事是否可能:
当我们使用哈希函数加密登录密码时,无法解密哈希以查找原始密码。
但是有可能找到该哈希值并将其直接发送到服务器,而不是输入哈希函数将加密到哈希值然后发送它的密码吗?
答案 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)
我对哈希函数绕过的想法是存储原始文件的副本,并具有修改副本的代码。制作原始的哈希值,然后找到一种方法将该哈希值发送给主机,有效地将修改后的消息伪装成原始消息!