web-dev-qa-db-ja.com

md5パスワードを作成してmysqlに保存する方法

おそらく非常に初心者の質問ですが、私は読んでいて、パスワードの作成と保存を理解するのに多少の困難を感じました。私が読んだMD5 /ハッシュのパスワードは、データベースに保存する最良の方法です。ただし、そもそもこれらのパスワードを作成するにはどうすればよいですか?

それで、ユーザーbobとパスワードbob123のログインページがあるとしましょう-データベースにbobsパスワードを取得する方法(ハッシュ)2.ハッシュされたパスワードを取得して確認するにはどうすればよいですか?

ありがとう

23
Fahad

2017/11/09の編集:O Jonesからの回答を必ずご覧ください。

まず、MD5は、この試行に使用できる最大のハッシュ方法ではありませんsha256またはsha512

つまり、hash('sha256')の代わりにmd5()を使用して、プロセスのハッシュ部分を表します。

最初にユーザー名とパスワードを作成するとき、未加工のパスワードをソルトでハッシュします(各パスワードにランダムな余分な文字を追加して、パスワードを長く/強くします)。

ユーザー作成フォームから次のように表示されます。

$escapedName = mysql_real_escape_string($_POST['name']); # use whatever escaping function your db requires this is very important.
$escapedPW = mysql_real_escape_string($_POST['password']);

# generate a random salt to use for this account
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "insert into user (name, password, salt) values ('$escapedName', '$hashedPW', '$salt'); ";

次に、ログインすると次のようになります。

$escapedName = mysql_real_escape_string($_POST['name']);
$escapedPW = mysql_real_escape_string($_POST['password']);

$saltQuery = "select salt from user where name = '$escapedName';";
$result = mysql_query($saltQuery);
# you'll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row['salt'];

$saltedPW =  $escapedPW . $salt;

$hashedPW = hash('sha256', $saltedPW);

$query = "select * from user where name = '$escapedName' and password = '$hashedPW'; ";

# if nonzero query return then successful login
43
JohnKlehm

あなたはパスワードを持っているという観点から推論する必要があります:

bobがアプリに登録されるときに、パスワードをmd5('bob123');として保存します

$query = "INSERT INTO users (username,password) VALUES('bob','".md5('bob123')."');

次に、bobがログインしているとき:

$query = "SELECT * FROM users WHERE username = 'bob' AND password = '".md5('bob123')."';

obvioulsyはユーザー名とパスワードに変数を使用します。これらのクエリはphpによって生成され、mysqlで実行できます

9
Dalen

パスワードハッシュにMD5を使用しないでください。このようなパスワードは、ミリ秒単位で解読できます。あなたは、サイバー犯罪者に捕らわれているはずです。

PHPは、信頼できるランダムソルトとRijndael/AES暗号化の複数ラウンドに基づいた 高品質で将来性のあるパスワードハッシュサブシステム を提供します。

ユーザーが最初にパスワードを入力すると、次のようにハッシュできます。

 $pass = 'whatever the user typed in';
 $hashed_password = password_hash( "secret pass phrase", PASSWORD_DEFAULT );

次に、$hashed_passwordをMySQLのvarchar(255)列に格納します。後で、ユーザーがログインしたい場合、ハッシュされたパスワードをMySQLから取得し、ユーザーがログインを提供したパスワードと比較できます。

 $pass = 'whatever the user typed in';
 $hashed_password = 'what you retrieved from MySQL for this user';
 if ( password_verify ( $pass , $hashed_password )) {
    /* future proof the password */
    if ( password_needs_rehash($hashed_password , PASSWORD_DEFAULT)) {
       /* recreate the hash */
       $rehashed_password = password_hash($pass, PASSWORD_DEFAULT );
       /* store the rehashed password in MySQL */
     }
     /* password verified, let the user in */
 }
 else {
     /* password not verified, tell the intruder to get lost */
 }

この将来性保証はどのように機能しますか? PHP=の将来のリリースは、暗号化をより速く、より簡単に一致させるために適応します。パスワードを再ハッシュして解読を難しくする必要がある場合、 password_needs_rehash() 関数はそれを検出します。

パンクしたタイヤを再発明しないでください。セキュリティのために、専門的に設計および検証されたオープンソースコードを使用します。

7
O. Jones

挿入:

INSERT INTO ... VALUES ('bob', MD5('bobspassword'));

検索:

SELECT ... FROM ... WHERE ... AND password=md5('hopefullybobspassword');

クエリで直接行う方法です。ただし、MySQLでクエリログが有効になっている場合、パスワードのプレーンテキストがこのログに書き込まれます。だから...スクリプトでMD5変換を行い、その結果のハッシュをクエリに挿入する必要があります。

5
Marc B

PHPにはmd5というメソッドがあります;-) Just $ password = md5($ passToEncrypt);

SQLで検索している場合、uはMySQLメソッドMD5()も使用できます。

 SELECT * FROM user WHERE Password='. md5($password) .'

またはSELECT * FROM ser WHERE Password = MD5( '。$ password。')

挿入するには、同じ方法で実行できます。

3
Smokefoot

パスワードハッシュに組み込まれたMySQLを使用しないのはなぜですか。

http://dev.mysql.com/doc/refman/5.1/en/password-hashing.html

mysql> SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+

比較のために、次のようなことができます:

select id from PassworTable where Userid='<userid>' and Password=PASSWORD('<password>')

値が返された場合、ユーザーは正しいです。

3
Lucian

私はPHPに驚くことはありませんが、これがあなたのしていることだと思います。

$ password = md5($ password)

および$password$_POST['password']または何でも

2
Taimur

セキュリティをさらに高めるために、md5暗号化と2つの異なるソルト文字列を使用できます。1つはphpファイルで定義され、もう1つは各パスワードレコードに対してランダムに生成された一意のソルトです。

以下に、salt、md5文字列、およびストアを生成する方法を示します。

    $unique_salt_string = hash('md5', microtime()); 
    $password = hash('md5', $_POST['password'].'static_salt'.$unique_salt_string);
    $query = "INSERT INTO users (username,password,salt) VALUES('bob','".$password."', '".$unique_salt_string."');

これで、すべてのパスワードに有効な静的ソルトが作成され、.phpファイルに保存されます。次に、登録の実行時に、その特定のパスワードに対して一意のハッシュを生成します。

これは最終的に次のようになります。綴りがまったく同じ2つのパスワードには、2つの異なるハッシュがあります。一意のハッシュは、現在のIDとともにデータベースに保存されます。誰かがデータベースを取得した場合、特定のパスワードごとに一意のソルトがすべて用意されます。しかし、彼らが持っていないのはあなたの静的な塩です。

たとえば、login.phpでパスワードの有効性を確認する方法は次のとおりです。

     $user = //username input;
     $db_query = mysql_query("SELECT salt FROM users WHERE username='$user'");
     while($salt = mysql_fetch_array($db_query)) {
            $password = hash('md5',$_POST['userpassword'].'static_salt'.$salt[salt]);
}

この方法は非常に強力で安全です。 sha512暗号化を使用する場合は、上記のコードでmd5の代わりにそれをハッシュ関数の中に入れます。

0
B.S.B.

次の行でハッシュを取得し、データベースに保存します。

$encryptedValue = md5("YOUR STRING");
0
Faisal Shaikh