172

これはプレーンなMD5よりどれくらい安全ですか? パスワードのセキュリティについて調べ始めたところです。私はPHPにかなり慣れていません。

$salt = 'csdnfgksdgojnmfnb';

$password = md5($salt.$_POST['password']);
$result = mysql_query("SELECT id FROM users
                       WHERE username = '".mysql_real_escape_string($_POST['username'])."'
                       AND password = '$password'");

if (mysql_num_rows($result) < 1) {
    /* Access denied */
    echo "The username or password you entered is incorrect.";
} 
else {
    $_SESSION['id'] = mysql_result($result, 0, 'id');
    #header("Location: ./");
    echo "Hello $_SESSION[id]!";
}
4

7 に答える 7

273

パスワードストレージスキームを安全にする最も簡単な方法は、標準ライブラリを使用することです。

セキュリティは、ほとんどのプログラマーが単独で取り組むよりもはるかに複雑で、目に見えない失敗の可能性がある傾向があるため、標準ライブラリを使用するのがほとんどの場合、最も簡単で最も安全な(唯一ではないにしても)利用可能なオプションです。


新しいPHPパスワードAPI(5.5.0+)

PHPバージョン5.5.0以降を使用している場合は、新しい簡略化されたパスワードハッシュAPIを使用できます。

PHPのパスワードAPIを使用したコードの例:

<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);

// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

(レガシー5.3.7以降をまだ使用している場合は、ircmaxell / password_compatをインストールして、組み込み関数にアクセスできます)


塩漬けハッシュの改善:コショウを追加

追加のセキュリティが必要な場合、セキュリティ担当者は現在(2017)、(自動的に)ソルトされたパスワードハッシュに「ペッパー」を追加することを推奨しています。

このパターンを安全に実装する単純なドロップインクラスがあります 。Netsilik/PepperedPasswordsgithub)をお勧めします。
MITライセンスが付属しているので、プロプライエタリプロジェクトでも好きなように使用できます。

を使用したコードの例Netsilik/PepperedPasswords

<?php
use Netsilik/Lib/PepperedPasswords;

// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');

$hasher = new PepperedPasswords($config['pepper']);

// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);

// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}


OLD標準ライブラリ

注意:これはもう必要ないはずです!これは歴史的な目的のためだけにここにあります。

ご覧ください:ポータブルPHPパスワードハッシュフレームワークphpassCRYPT_BLOWFISHそして可能な限りアルゴリズムを使用することを確認してください。

phpass(v0.2)を使用したコードの例:

<?php
require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

PHPassは、いくつかの非常によく知られているプロジェクトに実装されています。

  • phpBB3
  • WordPress2.5+およびbbPress
  • Drupal 7リリース(Drupal 5および6で利用可能なモジュール)
  • その他

良い点は、詳細について心配する必要がないことです。これらの詳細は、経験豊富な人々によってプログラムされ、インターネット上の多くの人々によってレビューされています。

パスワードの保存スキームの詳細については、Jeffのブログ投稿を参照してください:パスワードを誤って保存している可能性があります

あなたが「私はそれを自分でやる、ありがとう」のアプローチのために行くならあなたが何をするにしても、使わないMD5か、SHA1もう。これらは優れたハッシュアルゴリズムですが、セキュリティ上の理由から壊れていると見なされます。

現在、cryptを使用し、CRYPT_BLOWFISHを使用するのがベストプラクティスです。
PHPのCRYPT_BLOWFISHは、Bcryptハッシュの実装です。BcryptはBlowfishブロック暗号に基づいており、アルゴリズムを遅くするために高価なキー設定を利用しています。

于 2009-10-17T10:36:22.740 に答える
30

SQL ステートメントを連結する代わりにパラメーター化されたクエリを使用すると、ユーザーはより安全になります。また、ソルトはユーザーごとに一意である必要があり、パスワード ハッシュと共に保存する必要があります。

于 2009-10-17T06:57:10.763 に答える
12

PHP 5.5 (ここで説明する内容は、以前のバージョンでも使用できます。以下を参照してください) が近づいているので、その新しい組み込みソリューションを使用することをお勧めします:password_hash()password_verify(). 必要なパスワード セキュリティのレベルを達成するために、いくつかのオプションを提供します (たとえば、$options配列を介して「コスト」パラメーターを指定することにより) 。

<?php
var_dump(password_hash("my-secret-password", PASSWORD_DEFAULT));

$options = array(
    'cost' => 7, // this is the number of rounds for bcrypt
    // 'salt' => 'TphfsM82o1uEKlfP9vf1f', // you could specify a salt but it is not recommended
);
var_dump(password_hash("my-secret-password", PASSWORD_BCRYPT, $options));
?>

戻ります

string(60) "$2y$10$w2LxXdIcqJpD6idFTNn.eeZbKesdu5y41ksL22iI8C4/6EweI7OK."
string(60) "$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d."

ご覧のとおり、文字列にはソルトと、オプションで指定されたコストが含まれています。また、使用されるアルゴリズムも含まれています。

したがって、パスワードをチェックするとき (たとえば、ユーザーがログインするとき)、補完password_verify()機能を使用すると、パスワード ハッシュ自体から必要な暗号パラメーターが抽出されます。

password_hash()ソルトを指定しない場合、ソルトはランダムに生成されるため、生成されるパスワード ハッシュは の呼び出しごとに異なります。したがって、パスワードが正しい場合でも、以前のハッシュと新しく生成されたハッシュの比較は失敗します。

検証は次のように機能します。

var_dump(password_verify("my-secret-password", '$2y$10$BjHJbMCNWIJq7xiAeyFaHOGaO0jjNoE11e0YAer6Zu01OZHN/gk6K'));
var_dump(password_verify("wrong-password", '$2y$10$BjHJbMCNWIJq7xiAeyFaHOGaO0jjNoE11e0YAer6Zu01OZHN/gk6K'));

var_dump(password_verify("my-secret-password", '$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d.'));
var_dump(password_verify("wrong-password", '$2y$07$TphfsM82o1uEKlfP9vf1fOKohBqGVXOJEmnUtQu7Y1UMft1R4D3d.'));

これらの組み込み関数を提供することで、データが盗まれた場合のパスワード セキュリティがすぐに向上することを願っています。

password_hashPHP 5.3.7+ でPHP 5.5 を提供する小さなライブラリ (1 つの PHP ファイル) があります: https://github.com/ircmaxell/password_compat

于 2013-06-06T09:20:51.367 に答える
12

より良い方法は、各ユーザーが一意のソルトを持つことです。

ソルトを持つことの利点は、攻撃者がすべての辞書の単語の MD5 署名を事前に生成することが難しくなることです。しかし、攻撃者があなたが固定ソルトを持っていることを知った場合、固定ソルトがプレフィックスとして付けられたすべての辞書単語の MD5 署名を事前に生成することができます。

より良い方法は、ユーザーがパスワードを変更するたびに、システムがランダムなソルトを生成し、そのソルトをユーザー レコードと共に保存することです。(MD5 署名を生成する前にソルトを検索する必要があるため) パスワードをチェックするコストが少し高くなりますが、攻撃者が MD5 を事前に生成することははるかに困難になります。

于 2009-10-17T07:37:27.813 に答える
0

それは私には問題ありません。Atwood 氏は、レインボー テーブルに対する MD5 の強さについて書いており、基本的にはかなり座っているような長いソルトを使用します (ランダムな句読点/数字がいくつかありますが、改善される可能性があります)。

また、最近人気が高まっているように見える SHA-1 を見ることもできます。

于 2009-10-17T06:58:21.703 に答える
0

これは、プレーンテキストのパスワードを保存しない PHP + CouchDB.apache.org ログイン システムです。

私が読んだアドバイスによると、それは完全に安全なはずです。

CMS ログイン コード : https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91aee66041320976a6d76da7/nicerapp/boot.php#L56 呼び出し https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91aee66041320976a6d76da7/nicer7s/phpfunction.php L171

アプリ固有のビジネス コード: https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91aee66041320976a6d76da7/nicerapp/ajax_login.php#L87 呼び出し https://github.com/nicerapp/nicerapp/blob/24ff0ca317b28c1d91anice66041320976 functions.php#L230 は次のように呼び出します: https://github.com/nicerapp/nicerapp/blob/2d479b3e22dce9e7073525481b775f1bf7389634/nicerapp/apps/nicer.app/webmail/recrypt.php#L2

ウェブメール アプリの設定データをデータベースに編集するには: https://github.com/nicerapp/nicerapp/blob/main/nicerapp/apps/nicer.app/webmail/ajax_editConfig.php

于 2021-09-02T03:58:14.173 に答える
0

追加したい:

  • ユーザーのパスワードを長さで制限しない

古いシステムとの互換性のために、多くの場合、パスワードの最大長に制限を設定します。これは不適切なセキュリティ ポリシーです。制限を設定する場合は、最小の長さのパスワードに対してのみ設定してください。

  • ユーザーのパスワードを電子メールで送信しない

忘れたパスワードを回復するには、ユーザーがパスワードを変更できるアドレスを送信する必要があります。

  • ユーザーのパスワードのハッシュを更新する

パスワード ハッシュが古くなっている可能性があります (アルゴリズムのパラメーターが更新されている可能性があります)。機能password_needs_rehash()を利用することで、確認することができます。

于 2016-11-04T16:05:58.607 に答える