【问题标题】:How to check two hashed passwords are the same?如何检查两个散列密码是否相同?
【发布时间】:2011-01-04 10:47:28
【问题描述】:

我正在编写一个程序,在将登录详细信息发送到服务器之前,我使用 MD5 对其进行哈希处理,但我必须将其与从数据库中检索到的河豚 (jBCrypt) 哈希密码进行比较。

jBCrypt 用途:

if (BCrypt.checkpw("candidatePassword", hashedPwd)) {
// they are the same
}

问题是,我没有可供测试的候选密码。我怎样才能既安全地传输我的登录详细信息又将这些详细信息安全地存储在数据库中。解决这个问题的最佳方法是什么?

我使用用户名、时间戳、随机字节和密码来创建我的 md5 摘要值。

谢谢, 弗拉基米尔

【问题讨论】:

    标签: hash md5 blowfish digest jbcrypt


    【解决方案1】:

    仅考虑到两个哈希值,您不能1。哈希被设计为单向的;您无法从哈希中恢复原始数据,这就是为什么存储哈希密码被认为比存储加密密码更安全的原因。

    因此,根据散列验证数据的唯一方法是散列数据并查看结果是否匹配。


    1 当然,can'tonly 等词的真正意思是“除非你使用蛮力......”这些算法背后的理论证明它们是“合理的”安全的,但必须始终记住 theorypractice 之间的区别:理论上没有区别。

    【讨论】:

      【解决方案2】:

      Adam 是对的:如果将多个值散列在一起,则无法从散列中取回它们。

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

      webapps 的安全性是它自己的特殊领域,您可以查找许多资源来了解如何做到这一点。

      建议的方法是:

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

      • 从服务器解密或以其他方式“解包”这些值,并根据数据库中的值检查散列密码和用户名。如果匹配,则允许访问,如果不匹配,则拒绝。

      (这假设您使用随机字节作为散列的“盐”。如果不是,只需散列密码,而不是随机字节)。

      *= 这是关于加密如何工作的一个非常高级的想法,并假设一切都正确完成,并且没有中间步骤受到损害,等等。

      【讨论】:

      • 我认为问题在于客户端和服务器上使用了不同的哈希算法,因此即使密码相同,哈希也不会匹配。哦,“不会”的真正意思是“概率极小”。我想知道是否有任何其他技术领域需要比密码学更多的免责声明。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2011-06-22
      相关资源
      最近更新 更多