2010-01-13 56 views
2

我正在编写一个程序,在我将MD5发送给服务器之前使用MD5哈希登录详细信息,但我必须将它与从数据库检索到的blowfish(jBCrypt)散列密码进行比较。如何检查两个哈希密码是相同的?

jBCrypt用途:

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

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

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

感谢, 弗拉基米尔

回答

3

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

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


当然,字如不能只有真正的意思“除非你用蛮力......”这些算法背后的理论证明,他们是“合理地“安全,但必须始终记住理论练习之间的区别:理论上,没有区别。

0

亚当是对的:如果你将多个值散列在一起,你不能从散列中得到它们。

这听起来像你真正想要的是加密:加密消息是毫无意义的谁拦截它的对手,但可以有它的提取上一个友好的聚会,另一端值(S)*

安全对于webapps来说,它是拥有许多资源的专业领域,您可以查看如何执行此操作。

一个建议的方法是这样的:

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

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

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

* =这是加密是如何工作的一个非常高层次的想法,并承担一切都处理得当,没有中间步骤被攻破,等等,等等

+0

我认为问题是,不同的散列算法用在客户端和服务器上,所以即使密码相同,哈希也不匹配。哦,“不会”真的意味着“以一个微乎其微的可能性”。我想知道其他技术领域是否需要比密码更多的免责声明。 :-) – 2010-01-14 02:15:03