3

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

jBCrypt 使用:

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

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

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

谢谢,弗拉基米尔

4

2 回答 2

4

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

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


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

于 2010-01-13T01:19:49.120 回答
0

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

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

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

建议的方法是:

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

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

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

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

于 2010-01-13T02:25:52.557 回答