3

次のようなパスワードを格納するデータベース フィールドがありました。

TeacherPassword

j.lu01
pesci02
cricket01

ユーザーがパスワードを入力するテキストボックスがあり、それが行の1つと一致すると、次のページに移動します。以下は、パスワードをチェックするコードです。

 $teacherpassword = (isset($_POST['teacherpassword'])) ? $_POST['teacherpassword'] : '';

  if (isset($_POST['submit'])) {

    // don't use $mysqli->prepare here
    $query = "SELECT * FROM Teacher WHERE TeacherPassword = ? LIMIT 1";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("s",$teacherpassword);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherPassword);

しかし、私が行ったことは、フィールドがパスワードを文字列として表示するのではなく、パスワードが安全であるように一連の文字として表示するように、パスワード フィールドを更新したことです。以下は私が行った更新です:

UPDATE Teacher
SET TeacherPassword = Password(TeacherPassword);

これにより、パスワード フィールドは次のようになります。

TeacherPassword

    *6FF132E0666AC8462BC
    *FCF5F8CE105D0748315
    *FD4FA4B60EEF1E24050

私の質問は、MYsq​​li コードで、テキスト ボックスに入力された文字列パスワードを取得してj.lu01、データベース行のハッシュ パスワードと一致させるにはどうすればよい*6FF132E0666AC8462BCですか?

4

4 に答える 4

6

その場合はhash、データベースで検索する前にまずパスワードが必要です。ちなみに、sqlfiddleで実行してみましたが、異なるハッシュ値が生成されました

Password('j.lu01') => *7A48257211A5C6BF45C30374789E9027726D829D
Password('jlu_01') => *FCF5F8CE105D0748315591596E8A4F87A2E12B1A

-- your password field is truncated that's why it can't find the match also
-- alter TeacherPassword field and change it's length to 42

フィールドの長さを確認できますTeacherPasswordか?

SQLフィドル

于 2012-08-02T22:55:26.940 に答える
1

パスワードフィールドは20文字に制限されているため、ハッシュされたパスワードはその長さにトリミングされています。試してみてください。

SELECT * FROM Teacher WHERE TeacherPassword = LEFT(Password(?),20)

だが :

  1. パスワードはmysqlの内部使用を目的としているため、代わりに実際にSHA1を使用する必要があります
  2. パスワードフィールドのサイズを実際に変更する必要があります(まだエンコードされていない値がある場合)。
  3. パスワードをハッシュするときに、パスワードの前にランダムな文字列(たとえば、6文字)を付けてパスワードを「ソルト」することを検討する必要があります。これにより、2つの同一のパスワードが異なる方法でエンコードされます。

salt後でそれを行うには、テーブルに列を追加して、ランダムな文字列を入力する必要があります。

次に、次を使用してエンコードできます。

UPDATE Teacher SET TeacherPassword = SHA1(salt @password)

SELECT * FROM Teacher WHERE TeacherPassword = SHA1(salt @password)

かなり良い最終的な解決策は次のようになります:

ALTER TABLE Teacher CHANGE TeacherPassword TeacherPasswordOld VarChar(20)
ALTER TABLE Teacher ADD TeacherPassword VarChar(40)
ALTER TABLE Teacher ADD Salt VarChar(40)

udpateの場合は2つの値を渡します:@saltと@password

Update Teacher SET Salt=@salt, Password=SHA1(Salt @password)

次のようにphpでsaltを生成できる場所:

$salt = ""; 
for ($i = 0; $i < 40; $i++) { 
   $salt .= substr(
     "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", 
     mt_rand(0, 63), 
     1); 
}

パスワードを確認するには、次を使用します

SELECT * from Teacher 
-- if no "new" password, check the old one
WHERE TeacherPassword is null and TeacherPasswordOld=LEFT(Password(@password),20)) 
-- else check the new pass
   OR TeacherPassword = Sha1(salt @password)

ここで取られた塩発生器

于 2012-08-07T16:35:03.837 に答える
1

クエリを次のように変更するだけです。

SELECT * FROM Teacher WHERE TeacherPassword = Password(?) LIMIT 1
于 2012-08-02T21:52:34.653 に答える
0

以下のようにクエリを書くことができます:-

SELECT * FROM Teacher_Table WHERE HEX(t_password)=HEX('Your_Password') LIMIT 1;

セキュリティを強化するために使用HEX(), MD5()します。このクエリは MySQL でテストされています。

上記の機能を使用しない場合:-

 SELECT * FROM Teacher_Table WHERE t_password='Your_Password' LIMIT 1;

またPASSWORD()、上記の回答で述べたように使用することもできます。取得時にクエリを安全にする方法は他にもたくさんあります。

ハッカーを避けるために、上記のような機能を使用することをお勧めします。

于 2012-08-06T12:43:29.540 に答える