MD5パスワード保存のセキュリティ問題と選択肢

MD5安全ですか?

さまざまなセキュリティ事件の後、プレーンテキストのパスワードに格納されているパスワードを保存する際に、多くのシステムは、直接、変更されたパスワードの暗号化のほとんどが後にMD5(ハッシュ)を格納するためにはありませんが、これは本当に安全?

ここではMD5のスピードテストするためのスクリプトです、テスト結果は:

[root@f4d5945f1d7c tools]# php speed-of-md5.php
Array
(
    [rounds] => 100
    [times of a round] => 1000000 [avg] => 0.23415904045105 [max] => 0.28906106948853 [min] => 0.21188998222351 )

問題を発見していない:MD5速すぎて、強引につながりやすいです。

簡単な計算:

> Math.pow(10, 6) / 1000000 * 0.234 0.234 > Math.pow(36, 6) / 1000000 * 0.234 / 60 8.489451110400001 > Math.pow(62, 6) / 1000000 * 0.234 / 60 / 60 3.69201531296
  1. ちょうど0.234秒をクラック、6つの純粋なデジタルパスワードを使用してください!

  2. ちょうど8.49分で割れ、6つの数字+小文字のパスワードを使用してください!

  3. 大文字、小文字は限り3.69時間をクラックするよう、+ 6桁のパスワードを使用して!

もちろん、かなり推測の難しさを増加します長いパスワードを使用します。

> Math.pow(10, 8) / 1000000 * 0.234
23.400000000000002 > Math.pow(36, 8) / 1000000 * 0.234 / 60 / 60 / 24 7.640505999359999 > Math.pow(62, 8) / 1000000 * 0.234 / 60 / 60 / 24 / 365 1.6201035231755982
  1. 8つの純粋なデジタルパスワードを使用して、23.4秒にクラック!

  2. 8ビットの数字+小文字のパスワードは、7.64時間にクラック!

  3. + 8ビットデジタル大文字、小文字のパスワード、1.62年にクラック!

忘れてはいけない。しかし、これは単にPHPでの速度がちょうどスレッドCPUコアを使用し、私のPCに弱い鶏(i5-4460 CPUを3.20GHz)上で実行するには、この言語を解釈されます。その48個のスレッドをフルに活用して実行し、テストコードを再書き込みするためにC言語を使用して、最新のXeon E7 v4のシリーズCPUのサーバーに置く場合は、千数百倍の速度をアップグレードすることは容易です。そうであっても8桁のパスワード+大文字、小文字に限り、14時間程度をクラック!

しかも、多くの人々が、より規則的な文字や数字のパスワードを使用しているブルートフォースの困難さを軽減することができます...あなたは、固定塩や塩を追加しない場合は、レインボーテーブルが破損しても、もっと簡単です...

だから、どのように保存されたパスワードのセキュリティを強化するには?bcryptの!

セキュリティは、ブルートフォース攻撃の少なくとも難しさがポイントをアップグレードする余裕がないことができるように、パスワードを推測することの難しさをアップグレードすることです改善します。(もちろん、ユーザーのパスワードの長さは、もちろん、また、非常に重要なことは、少なくとも8、長く安全にお勧めします)

ここでのスポットを持っている:PHPは本当に世界最高の言語である - ソリューションを与えられている標準ライブラリ。

PHPのバージョン5.5が追加  password_xxx 一連の機能を、以前のバージョンながら、またライブラリと互換性があります使用することができます:password_compatを
「暗号化ハッシュアルゴリズム」コアの拡張と呼ばれるパッケージに保存された簡潔なパスワードのシリーズを提供します機能。簡単な紹介:

  1. password_hash この関数は、現在のデフォルト(のみ使用)bcryptのアルゴリズム、強化されたバージョンと同等で使用されるMD5パスワードの暗号化(ハッシュ)であり、

  2. password_verify パスワード検証機能、安全な文字列比較アルゴリズム内部使用され、時間ベースの攻撃は、と同等のを防ぐことができます $hashedPassword === md5($inputPassword)

  3. password_needs_rehash あなたがアップグレードする必要があるかどうかを判断する機能で、この機能は強力であり、そして再び次の詳細な話

password_hash 私たちは、デフォルトでは、今使用し、アルゴリズムが行う方法ですだけbcryptのアルゴリズム、あることができるアルゴリズムを渡す必要がありますか?それbcryptの選択になるのはなぜPHP標準ライブラリ?

bcryptのフグのアルゴリズムは、ニールス・プロボスとデイビット・マジャーズ設計によって、専用のパスワードハッシュに基づくアルゴリズムです。この特別なアルゴリズムは他のアルゴリズムの追求が長く、より大きな、その名の通り、このアルゴリズムは非常に重要な引数:.コストを持って、時間のかかる値に高速であるということですが、指数関数的です - - プロセスの一部を暗号化することは、そのようなことです:

EksBlowfishSetup(cost, salt, key)
    state <- InitState()
    state <- ExpandKey(state, salt, key)
    repeat (2^cost)                         // "^"表示指数关系 state <- ExpandKey(state, 0, key) state <- ExpandKey(state, 0, salt) return state

以下では、このようなテストの作者(個人弱いマシンPC、i5-4460 CPUの3.20GHz)の結果です:

      cost       time
         8   0.021307
         9   0.037150
        10   0.079283 11 0.175612 12 0.317375 13 0.663080 14 1.330451 15 2.245152 16 4.291169 17 8.318790 18 16.472902 19 35.146999

添付ファイル:テストコード

この速度は、単にMD5カタツムリやチーターと比較して差です - でもコスト= 8で、8ビットには、大文字と小文字+数字ではなく、一般的なサーバが設定されます言及し、暴力から抜け出すために14年を持っているパスワードを、少なくとも10以上の値(54年以上が必要になります)。

明らかに、コストが大きく、より良いではない、それ以上は、CPUサーバを占有しますが、簡単にDOS攻撃につながります。推奨される設定は10〜12は、サーバのニーズ及び動作に応じて構成することが可能です。最高の同じIPの上に同じユーザログはDOS攻撃を防ぐために作られた試行回数を制限しながら。

安全なパスワードの保存プログラム

上側の合計は、安全なパスワード格納されたプログラムはする必要があります。このよう:(直接)のバーコードを置きます

class User extends BaseModel { const PASSWORD_COST = 11; // 这里配置bcrypt算法的代价,根据需要来随时升级 const PASSWORD_ALGO = PASSWORD_BCRYPT; // 默认使用(现在也只能用)bcrypt /** * 验证密码是否正确 * * @param string $plainPassword 用户密码的明文 * @param bool $autoRehash 是否自动重新计算下密码的hash值(如果有必要的话) * @return bool */ public function verifyPassword($plainPassword, $autoRehash = true) { if (password_verify($plainPassword, $this->password)) { if ($autoRehash && password_needs_rehash($this->password, self::PASSWORD_ALGO, ['cost' => self::PASSWORD_COST])) { $this->updatePassword($plainPassword); } return true; } return false; } /** * 更新密码 * * @param string $newPlainPassword */ public function updatePassword($newPlainPassword) { $this->password = password_hash($newPlainPassword, self::PASSWORD_ALGO, ['cost' => self::PASSWORD_COST]); $this->save(); } }

この方法では、登録時や通話のパスワードを変更  $user->updatePassword() ログオンするとコールする際にパスワードを設定する  $user->verifyPassword() パスワードが正しいの下であることを確認します。
ある程度すると、ハードウェアのパフォーマンス、および= 11費用は、変更の下で、時間のセキュリティ要件を満たすことができない  PASSWORD_COST 、より安全なパスワードの保存を行い、シームレスにアップグレードすることができます値。

 

 

 

 

パスワードのハッシュアルゴリズム

おすすめ

転載: www.cnblogs.com/2019gdiceboy/p/11121425.html
おすすめ