如何检查两个哈希密码是否相同?

3
我正在编写一项程序,在将登录详细信息发送到服务器之前,我使用MD5对其进行哈希处理,但是在服务器上,我必须将其与从数据库检索的blowfish(jBCrypt)哈希密码进行比较。
jBCrypt使用:
if (BCrypt.checkpw("candidatePassword", hashedPwd)) {
// they are the same
}

问题在于,我没有候选密码进行测试。我如何既能够安全地传输我的登录详细信息,又能够在数据库中安全地存储这些详细信息。有什么最好的方法来解决这个问题?
我使用用户名、时间戳、随机字节和密码来创建我的 md5 摘要值。
谢谢, 弗拉基米尔
2个回答

4
只给定两个哈希值,你无法还原出原始数据1。哈希算法是单向的,无法从哈希值中恢复原始数据,这就是为什么存储哈希密码比存储加密密码更安全的原因。
因此,验证数据是否与哈希值匹配的唯一方法是对数据进行哈希处理并查看结果是否匹配。

1 当然,“不能”和“只能”这样的词实际上意味着“除非你使用暴力破解……”。这些算法背后的理论证明它们是“相当”安全的,但人们必须始终记住“理论”和“实践”的差别:在理论上,没有区别。


0

Adam是正确的:如果你将多个值哈希在一起,就无法从哈希中获取它们。

听起来你真正想要的是加密:加密的消息对于拦截它的对手来说是毫无意义的,但可以在另一端由友好方提取其价值。

Web应用程序的安全性是一个特殊领域,有许多资源可以查阅如何实现此目标。

建议的方法如下:

  • 从客户端创建随机字节和密码的哈希。将用户名、时间戳和哈希值打包,并使用SSL或加密方式安全地发送到服务器。

  • 从服务器端解密或“解包”这些值,并将哈希密码和用户名与数据库中的值进行比较。如果匹配,则允许访问;如果不匹配,则拒绝访问。

(这假设您正在使用随机字节作为哈希的“盐”。如果没有,请只对密码进行哈希,而不是随机字节)。

*= 这是加密工作原理的一个非常高级的概念,假设所有步骤都得到了正确执行,并且没有中间步骤被破坏等等。


我认为问题在于客户端和服务器使用了不同的哈希算法,因此即使密码相同,哈希也不会匹配。哦,而“不会”实际上意味着“概率极小”。我想知道是否有任何其他技术领域需要比加密更多的免责声明。 :-) - Adam Liss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接