我正在编写一个程序,我将MD5用于散列登录详细信息,然后再将其发送到服务器,但我必须将其与从数据库中检索到的河豚(jBCrypt)哈希密码进行比较。
jBCrypt使用:
if (BCrypt.checkpw("candidatePassword", hashedPwd)) {
// they are the same
}
问题在于,我没有候选密码可供测试。如何安全传输我的登录详细信息以及在数据库上安全存储这些详细信息。解决这个问题的最佳方式是什么?
我使用用户名,时间戳,随机字节和密码来创建我的md5摘要值。
谢谢, 弗拉基米尔
答案 0 :(得分:3)
只给出两个哈希值,你不能 1 。哈希设计为单向;您无法从散列中恢复原始数据,这就是为什么存储散列密码被认为比存储加密密码更安全。
因此,针对散列验证数据的唯一方法是散列数据并查看结果是否匹配。
1 当然,像这样的词不能而只真正意味着“除非你使用暴力......”这些算法背后的理论证明它们“合理”安全,但必须始终记住理论和实践之间的区别:理论上,没有区别。
答案 1 :(得分:0)
Adam是对的:如果你将多个值一起散列,你就无法从散列中恢复它们。
听起来你真正想要的是加密:对于拦截它的对手来说,加密的信息是没有意义的,但是友方可以在另一端提取它的价值。*
Web应用程序的安全性是它自己的特殊领域,有许多资源可供您查看如何执行此操作。
建议的方法是:
从客户端,创建随机字节和密码的哈希值。打包用户名,时间戳和散列值,并将其安全地发送到服务器(使用SSL或加密)。
从服务器解密或以其他方式“解包”值,并根据数据库中的值检查散列密码和用户名。如果匹配,则允许访问,如果不匹配,则拒绝。
(这假设您使用随机字节作为哈希的'salt'。如果不是,只需哈希密码,而不是随机字节。)
* =这是一个关于加密如何工作的高级概念,并假设一切都已正确完成,没有中间步骤受到损害等等。