ハッシュ値のパスワードMYSQL検索で一致しない
PHPでMYSQLにハッシュ値にしたパスワードを登録して、同じハッシュ値で検索を行いましたが、どうしても検索結果で一致しません。
パスワードの文字列をMD5を使ってハッシュ値に変換して次のようにMYSQLに登録しました。
$email = htmlspecialchars($_POST["email"]);
$user_name = htmlspecialchars($_POST["user_name"]);
$password = md5(htmlspecialchars($_POST["password"]));
$sql = 'INSERT INTO user_tbl (email,user_name,password) VALUES ( "' . $email . '","' . $user_name . '","' . $password . '" )';
$sth = $dd->prepare($sql);
$sth->execute( array() );
$qid = $dd->lastInsertId();
※user_tblの定義のこんな感じにしてあります。
CREATE TABLE user_tbl ( email varchar(50) NOT NULL,
user_name varchar(20) NOT NULL,
password VARCHAR(50) NOT NULL );
検索する処理でSQL等は次のように処理しましたが、検索結果がゼロ件でした。
$email = htmlspecialchars($_POST["email"]);
$beforepass = md5(htmlspecialchars($_POST["beforepass"]));
$afterpass = md5(htmlspecialchars($_POST["afterpass"]));
$sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';
$q = $dd->prepare( $sql );
$q->execute();
if($q->fetchColumn() == 1){
//ここでパスワードが一致した場合の処理を書く
}
そこで次の2パターンのようにSQL文を少し変えてみたらそれぞれの検索結果が1件でした。
$sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';
↓
$sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '"';
$sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and password = "' . $beforepass . '"';
↓
$sql = 'SELECT count(password) FROM user_tbl WHERE email = "' . $email . '" and user_name = "tanaka"';
(MYSQLのuser_tblのuser_nameには'tanaka'と入っている状態で実行したものです)
SQLに渡される各変数には文字列が代入済みであることが確認できています。
MD5でハッシュ化した文字列同士を比較してどうして検索結果が一致しないのでしょうか?
ちなみに検索したいパスワードのハッシュ値とDBに格納されているパスワードのハッシュ値を目で比較したら一致していました。
以上です。
ハッシュ値を検索条件に入れる場合に特殊な事をするのでしょうか?
ヒントだけでもよいので教えて下さい。
宜しくお願いします。
os: windows 7
eclipse: Version: 4.2.0
Build SDK: Android 4.1(API 16)
PHP 5
お礼
ご回答ありがとうございます。 アドバイスに従い、まずは平文での認証を試したところ認証されませんでした。 原因はContextのpathの指定が間違っていた為でした。 修正して平文での認証は通るようになりましたので暗号化を試したところダメでした。 パスワードは MessageDigest md = MessageDigest.getInstance("SHA"); md.update("1234".getBytes()); md.digest(); として得られたものを入れていますので、 Realmでは digest="SHA" と指定しています。 暗号化の種類が間違っているのでしょうか?