1

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

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

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

我想在 java 中执行此操作,但我找不到任何关于此的指南。找了一整天,谢谢。

4

1 回答 1

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 Salt“字符串”:5 哈希函数:$cleartext * $salt 哈希密码:50

没有人可以从散列密码中提取原始密码。密码可能是 25、1、50、10、5。

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

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

于 2016-04-23T18:07:09.383 回答