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
-
ちょうど0.234秒をクラック、6つの純粋なデジタルパスワードを使用してください!
-
ちょうど8.49分で割れ、6つの数字+小文字のパスワードを使用してください!
-
大文字、小文字は限り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
-
8つの純粋なデジタルパスワードを使用して、23.4秒にクラック!
-
8ビットの数字+小文字のパスワードは、7.64時間にクラック!
-
+ 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を。
「暗号化ハッシュアルゴリズム」コアの拡張と呼ばれるパッケージに保存された簡潔なパスワードのシリーズを提供します機能。簡単な紹介:
-
password_hash
この関数は、現在のデフォルト(のみ使用)bcryptのアルゴリズム、強化されたバージョンと同等で使用されるMD5パスワードの暗号化(ハッシュ)であり、 -
password_verify
パスワード検証機能、安全な文字列比較アルゴリズム内部使用され、時間ベースの攻撃は、と同等のを防ぐことができます$hashedPassword === md5($inputPassword)
-
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
、より安全なパスワードの保存を行い、シームレスにアップグレードすることができます値。
パスワードのハッシュアルゴリズム
- 簡単な紹介
- インストール/設定
- 定義済み定数
- 暗号ハッシュ関数アルゴリズム
- password_get_info -関連情報のハッシュ(ハッシュ)を返します。
- password_hash -パスワードハッシュを作成します(ハッシュ)
- password_needs_rehash -検出されたハッシュ値は、指定されたオプションに一致します
- password_verify -パスワードのハッシュ値が一致するかどうかを確認します