我正在使用ipb论坛软件。我有成员表名称实体和members_pass_hash和members_pass_salt。我在编写查询语句以授权成员时遇到问题
String Sql="Select * from members where name=? and members_pass_hash=?";
我知道这是错的,因为密码不是以纯文本形式存储的,但我不知道该怎么做。
我想在java中执行此操作,但我找不到任何指南。一直在寻找,谢谢。
答案 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()函数必须是最初散列密码以将其存储到数据库中时使用的函数。检查用于“更改密码”的源代码功能