使用散列/盐渍密码通过数据库验证成员

时间:2016-04-23 17:51:29

标签: java mysql ipb

我正在使用ipb论坛软件。我有成员表名称实体和members_pass_hash和members_pass_salt。我在编写查询语句以授权成员时遇到问题

    String Sql="Select * from members where name=? and members_pass_hash=?";

我知道这是错的,因为密码不是以纯文本形式存储的,但我不知道该怎么做。

我想在java中执行此操作,但我找不到任何指南。一直在寻找,谢谢。

1 个答案:

答案 0 :(得分:1)

在SQL命令结束时你有一个备用。除了mySQL命令行客户端之外也不需要;(可能会因你的客户端库而导致错误)。

盐渍密码哈希通常通过获取盐字符串(有时将其存储为哈希密码的前缀),计算盐并比较结果来验证。

在伪代码中:

($id, $salt, $stored_hashed_password) = SELECT id, salt, hashed_password FROM members WHERE name=?
$entered_hash_password = hash_password($salt, $entered_cleartext_password)
if ($entered_hash_password == $stored_hash_password) {
   say "Yeah, you got it!";
} else {
   say "Go away!";
}

比较显然必须是字符串比较。

更新: 关于散列密码的非常简单的例子:

明文密码:10 盐“字符串”:5 哈希函数:$ cleartext * $ salt 哈希密码:50

没有人可以从哈希密码中提取原始密码。密码可以是25,1,50,10,5。

真正的哈希函数要复杂得多且不可逆转。

伪代码样本中使用的hash_password()函数必须是最初散列密码以将其存储到数据库中时使用的函数。检查用于“更改密码”的源代码功能