43

はい、パスワードをプレーン テキストで保存することはお勧めできません。

4

6 に答える 6

50

まず、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.htmlhttp://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdfhttp://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdfおよびsha-1 衝突の弱点について


于 2013-02-10T13:40:04.670 に答える
3

sha1 や md5 などのハッシュ アルゴリズムは、パスワードの保存には適していません。それらは非常に効率的になるように設計されています。これは、総当たり攻撃が非常に高速であることを意味します。ハッカーがハッシュ化されたパスワードのコピーを入手したとしても、ブルート フォース攻撃を実行するのは非常に簡単です。ソルトを使用すると、レインボー テーブルの効果が低下しますが、ブルート フォースに対しては何もしません。遅いアルゴリズムを使用すると、ブルート フォースが無効になります。たとえば、bcrypt アルゴリズムは好きなだけ遅くすることができ (作業係数を変更するだけです)、内部でソルトを使用してレインボー テーブルから保護します。私があなただったら、そのようなアプローチまたは類似の方法 (例: scrypt または PBKDF2) を使用します。

于 2013-02-10T13:39:39.497 に答える
2

データベース内のパスワードは暗号化して保存する必要があります。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 分) ブロックされます。ブルートフォース攻撃の成功を最小限に抑える必要があります。

于 2013-02-10T13:40:31.453 に答える
2

ユーザーの一意のソルト (たとえば、ユーザー名 + 電子メールから生成) を保存し、パスワードを保存します。ログイン時に、データベースからソルトを取得し、ソルト + パスワードをハッシュします。
bcrypt を使用してパスワードをハッシュします。

于 2013-02-10T13:40:56.537 に答える
1

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!")
}

ドキュメンテーション :

http://www.php.net/manual/en/function.crypt.php

于 2013-02-10T13:42:34.953 に答える
0

一方向暗号化を使用する必要があります (これは、値を暗号化する方法であるため、元に戻すのは非常に困難です)。私は MySQL に詳しくありませんが、簡単に検索すると、まさにこの種の暗号化を行う password() 関数があることがわかります。DBに暗号化された値を保存し、ユーザーが認証したいときに、提供されたパスワードを取得し、同じアルゴリズム/関数を使用して暗号化し、その値がデータベースに保存されているパスワードと同じであることを確認しますそのユーザー。これは、ブラウザとサーバー間の通信が安全であること、つまり https を使用していることを前提としています。

于 2013-02-10T13:43:58.813 に答える