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 に答える