5

データベースにソルトを使用した PHP ログイン スクリプトがありますが、登録スクリプトには次のように表示されます。

$qry = "INSERT INTO accounts(username, firstname, lastname, password) " . 
VALUES('$username','$fname','$lname','" . md5($_POST['password']) . "')";

ログインの場合:

$qry="SELECT * FROM accounts WHERE username='$username' AND password='" .
md5($_POST['password']) . "'";

MD5 を置き換えることができるコードはありますか? より安全なもの?

SHA1か何かについて聞いたことがあります。

4

3 に答える 3

3

簡潔な答え

使用しbcryptないmd5またはsha1

より長い答え

を使用するのcrypt()は難しいです。PHP バージョン 5.5 には、新しい PHP パスワード ハッシュ API が含まれています。

https://gist.github.com/nikic/3707231

それを使用bcryptして、プロセス全体を非常に簡単にします。もちろん、php 5.5 はまだ準備ができていません。そのため、当面は、この新しい API を提供するライブラリがあります。

https://github.com/ircmaxell/password_compat

編集:トピックに関するより完全な回答については、このスレッドを参照してください。

PHPでパスワードをハッシュするためにbcryptをどのように使用しますか?

于 2013-05-01T23:13:44.347 に答える
1

@jszbody の投稿を考慮して、使用しているスキームが必要であることを伝えるために、パスワード フィールドも更新する必要があります。

現在 MD5 ハッシュを持っている場合、「BAC232BC1334DE」か何かがあるかもしれません。

SHA などにアクセスするときは、「SHA:YOURSHAHASHHERE」に変更する必要があります。

現在、既存のパスワードを変更することはできません。これにより、両方のスキームをサポートできるようになったため、下位互換性が向上します。

ログイン時に元のパスワードを取得するため、ユーザーがログインするときにパスワードを動的にアップグレードできます。

ユーザーレコードを取得し、パスワードを確認します。スキームがない場合は、MD5 を使用してパスワードを比較します。それらが正しい (つまり、ログインできる) 場合は、古い MD5 パスワードを新しい SHA パスワードに更新できます。

また、パスワードをソルトしていないようです。Mary Sue がパスワードに「ilovekittens」を使用し、Big Jake Mahoney がパスワードとして「ilovekittens」を使用する場合に、同じパスワードに対して同じパスワードを取得しないように、パスワードをソルトする必要があります。

パスワードにソルトを保存することもできます: "SHA:RANDOMSALTCHARACTERS:YOURSALTEDHASHHERE".

塩漬けがおすすめです。無塩、使用するスキームはほとんど問題ではありません。

于 2013-05-01T23:40:43.023 に答える
0

次のクラスを使用してみてください。

<?php
    class PassHash {  

        // blowfish  
        private static $algo = '$2a';  

        // cost parameter  
        private static $cost = '$31';  

        // mainly for internal use  
        public static function unique_salt() {  
            return substr(sha1(mt_rand()),0,22);  
        }  

        // this will be used to generate a hash  
        public static function hash($password) {  

            return crypt($password,  
                        self::$algo .  
                        self::$cost .  
                        '$' . self::unique_salt());  

        }  
        // this will be used to compare a password against a hash  
        public static function check_password($hash, $password) {  

            $full_salt = substr($hash, 0, 29);  

            $new_hash = crypt($password, $full_salt);  

            return ($hash == $new_hash);  

        }  

    }  

?>

次のようにページに含めます。

include_once('passhash.class.php');

次の方法でパスワードをハッシュします。

PassHash::hash("test");

そしてそれをチェックしてください:

 if (PassHash::check_password($databasepassword, $formpassword)){
  // do stuff
 } 

この関数は Blowfish 暗号を使用します。Blowfish の詳細については、PHP.net/crypt を参照してください。

Blowfish は、パスワードを暗号化する最も効果的かつ強力な方法と考えられています。ソルトを使用せずに MD5 または SHA1 を使用しないでください。

于 2013-05-01T23:43:45.117 に答える