0

私は1時間探し回っていますが、これを機能させることができません。

userと呼ばれる2列のテーブルがありusername varchar(64)ますpassword binary(20)。これを迅速かつ汚いものにしたいので、SHA1暗号化を使用しています。

mysql> describe user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(64) | NO   | PRI | NULL    |       |
| password | binary(20)  | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

ユーザーのパスワードを認証したいとき、ちょっとしたトラブルに遭遇しています。結果のパスワードがバイナリで取得されません。助言がありますか?ありがとう。

$username = mysql_real_escape_string($_POST['username']);
$password = sha1(mysql_real_escape_string($_POST['password']));
$binPass = pack("H*", $password);
$query = "SELECT * FROM `user` WHERE `username` = '$username' AND `password` = $binPass;";
4

1 に答える 1

0

SQL でエスケープされたパスワードのチェックサムを計算しても意味がありません。生のパスワードのチェックサムを計算したいのですが、クエリでバイナリ データを使用しているため、mysql_real_escape_stringクエリに含める前に を使用してエスケープする必要があります。そうしないと、予期しない結果が得られます。

$username = mysql_real_escape_string($_POST['username']);
$password = sha1($_POST['password']);
$binPass = mysql_real_escape_string(pack("H*", $password));
$query = "SELECT * FROM `user` WHERE `username` = '$username' AND `password` = '$binPass'"

バイナリ形式でデータベースに保存することで、スペースの 50% を節約できますが、パフォーマンスの向上はせいぜい最小限です。代わりに、16 進数のチェックサムをデータベースに保存することを検討する必要があります。

于 2012-12-09T04:34:51.410 に答える