はい、パスワードをプレーン テキストで保存することはお勧めできません。
6 に答える
まず、md5 と sha1 は衝突攻撃に対して脆弱であることが証明されており、簡単にレインボー テーブルに登録できます (共通パスワードのデータベースでハッシュが同じかどうかを確認した場合)。
現在、使用できるパスワードとして十分に安全なものが 2 つあります。
最初は sha512 です。sha512 は SHA2 のサブバージョンです。SHA2 は衝突攻撃に対して脆弱であることが証明されておらず、sha512 は 512 ビットのハッシュを生成します。sha512 の使用方法の例を次に示します。
<?php
hash('sha512',$password);
もう 1 つのオプションは bcrypt と呼ばれます。bcrypt は安全なハッシュで有名です。おそらく最も安全で、最もカスタマイズ可能なものでもあります。
bcrypt の使用を開始する前に、サーバーで bcrypt が有効になっているかどうかを確認する必要があります。次のコードを入力してください。
<?php
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
echo "CRYPT_BLOWFISH is enabled!";
}else {
echo "CRYPT_BLOWFISH is not available";
}
有効になっていることが返された場合、次のステップは簡単です。パスワードを bcrypt するために必要なことは次のとおりです (注: カスタマイズ性を高めるには、このHow do you use bcrypt for hashing passwords in PHP?を参照する必要があります):
crypt($password, $salt);
ソルトは通常、パスワードをハッシュするときにすべてのパスワードの最後に追加するランダムな文字列です。ソルトを使用するということは、誰かがあなたのデータベースを取得した場合に、一般的なパスワードのハッシュをチェックできないことを意味します。データベースのチェックは、レインボー テーブルを使用して呼び出されます。ハッシュするときは、常にソルトを使用する必要があります。
SHA1 および MD5 衝突攻撃の脆弱性に関する私の証拠は次のとおりです:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html、http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf、http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdfおよびsha-1 衝突の弱点について
sha1 や md5 などのハッシュ アルゴリズムは、パスワードの保存には適していません。それらは非常に効率的になるように設計されています。これは、総当たり攻撃が非常に高速であることを意味します。ハッカーがハッシュ化されたパスワードのコピーを入手したとしても、ブルート フォース攻撃を実行するのは非常に簡単です。ソルトを使用すると、レインボー テーブルの効果が低下しますが、ブルート フォースに対しては何もしません。遅いアルゴリズムを使用すると、ブルート フォースが無効になります。たとえば、bcrypt アルゴリズムは好きなだけ遅くすることができ (作業係数を変更するだけです)、内部でソルトを使用してレインボー テーブルから保護します。私があなただったら、そのようなアプローチまたは類似の方法 (例: scrypt または PBKDF2) を使用します。
データベース内のパスワードは暗号化して保存する必要があります。SHA2、SHA2、WHIRLPOOL、bcrypt DELETED: MD5 または SHA1 などの一方向暗号化 (ハッシュ) をお勧めします。(それらはより古く、脆弱です
それに加えて、ユーザーごとに生成された追加のランダム文字列「salt」を使用できます。
$salt = MD5($this->createSalt());
$Password = SHA2($postData['Password'] . $salt);
createSalt()
この場合は、ランダムな文字から文字列を生成する関数です。
編集: または、より多くのセキュリティが必要な場合は、2 つのソルトを追加することもできます: $salt1 。$パス。$salt2
実行できるもう 1 つのセキュリティ対策は、ユーザーの非アクティブ化です。5 回 (またはその他の回数) の不正なログイン試行の後、ユーザーは x 分間 (たとえば 15 分) ブロックされます。ブルートフォース攻撃の成功を最小限に抑える必要があります。
ユーザーの一意のソルト (たとえば、ユーザー名 + 電子メールから生成) を保存し、パスワードを保存します。ログイン時に、データベースからソルトを取得し、ソルト + パスワードをハッシュします。
bcrypt を使用してパスワードをハッシュします。
DBにパスワードを保存するためにcryptを使用するのが最善です
サンプルコード:
$crypted_pass = crypt($password);
//$pass_from_login is the user entered password
//$crypted_pass is the encryption
if(crypt($pass_from_login,$crypted_pass)) == $crypted_pass)
{
echo("hello user!")
}
ドキュメンテーション :
一方向暗号化を使用する必要があります (これは、値を暗号化する方法であるため、元に戻すのは非常に困難です)。私は MySQL に詳しくありませんが、簡単に検索すると、まさにこの種の暗号化を行う password() 関数があることがわかります。DBに暗号化された値を保存し、ユーザーが認証したいときに、提供されたパスワードを取得し、同じアルゴリズム/関数を使用して暗号化し、その値がデータベースに保存されているパスワードと同じであることを確認しますそのユーザー。これは、ブラウザとサーバー間の通信が安全であること、つまり https を使用していることを前提としています。