2008-08-03 22 views
27

パスワードを暗号化する最も早くて安全な方法は何ですか(PHPが優先されます)。パスワードの暗号化

つまり、後で私のWebサイトを別のサーバーに移行すると、パスワードは引き続き有効になりますか?

私が今聞いたように私が使っている方法は、サーバーにインストールされているライブラリの正確なバージョンに依存しています。

答えて

29

あなたのログインシステムの暗号化方法を選択している場合、スピードはあなたの友人ではなく、JeffはThomas Ptacekとパスワードを覚えていました。conclusionは、最も低速で最も安全な暗号化方法あなたは余裕があります。トーマスPtacekのブログから


速度は、パスワードのハッシュ関数にしたくない、まさにです。

最新のパスワードスキームは、増分パスワードクラッカーで攻撃されます。

インクリメンタルクラッカーは、すべてのクラックされた可能性のあるパスワードを事前に計算しません。彼らはそれぞれのパスワードハッシュを個別に検討し、PHPログインページと同じ方法でパスワードハッシュ関数を使って辞書をフィードします。 Ophcrackのようなレインボーテーブルクラッカーは、パスワードを攻撃するスペースを使います。 John the Ripper、Crack、LC5のようなインクリメンタルクラッカーは、統計と計算を時間とともに処理します。

パスワードアタックゲームは、パスワードXを解読するのにかかる時間で採点されます。レインボーテーブルでは、その時間はテーブルの大きさと検索の速さによって異なります。インクリメンタルクラッカーでは、パスワードハッシュ関数の実行速度に依存します。

パスワードハッシュ関数を最適化すればするほど、パスワードハッシュ関数が高速になるほどスキームが弱くなります。 MD5とSHA1は、DESのような従来のブロック暗号であっても高速に設計されています。 MD5、SHA1、およびDESは弱いパスワードハッシュです。最新のCPUでは、DESやMD5などの生の暗号ビルディングブロックをビットスライス、ベクトル化、並列化して、パスワード検索を高速に行うことができます。 Game-over FPGAの実装には数百ドルしかかかりません。

14

私はPeterです。開発者はパスワードを理解していないようです。 MD5やSHA1は高速であるため、私たちはすべて(そして私もこれも罪を犯しています)選んでいます。それについて考える(誰かが最近私にそれを指摘した)、それは意味をなさない。私たちは、愚かな遅いハッシュアルゴリズムを選ぶべきです。私は物事の規模では、忙しいサイトがパスワードをハッシュすることを意味しますか? 1/2分ごとに? 0.8秒と0.03秒の間にサーバーが賢明なのは誰ですか?しかし、その余分な遅さは、すべてのタイプの一般的なブルートフォッシュ攻撃を防ぐために巨大です。

私の読んだところ、bcryptは安全なパスワードハッシュ用に特別に設計されています。それはフグに基づいており、多くの実装があります。

PHPのために、私は必ずしも最速けど素敵なバランス、サーバーのいくつかを探していないよhttp://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

2

をチェックアウトBCrypt.NET、誰もやって.NETの場合PHPPass http://www.openwall.com/phpass/

をチェックアウトすることこのコードはかなり遅いために開発されています。パスワードをハッシュして保存するスクリプトは実行するのに5〜6秒かかっています。ハッシュに絞っています(ハッシングをコメントすると、 2秒)。これは、最も安全である必要はありません

、私は(今の)銀行のためのcoddingませんが、私は確かにはプレーンテキストとしてパスワードを保存しないでう。

+0

これは閉じていますが、最も安全にハッシュパスワードを設定する必要があります。 someeones銀行口座のパスワードを取得する最も簡単な方法は?あなたが人々にサインアップする素晴らしい探しているウェブサイトを作成します。ほとんどの人は既存のパスワードを使用します。パスワードの巨大なリストがあります。ポイントは、他の人のパスワードを取得する最も速い方法は、それが貧弱な実装であることが分かっていれば、あなたのシステムをハックすることです。 –

8

を暗証番号に暗号化したくないことを指摘してください。ハッシュです。

暗号化されたパスワードを復号化して、誰かにパスワードを表示させることができます。ハッシングは一方向操作であり、ユーザーの元のパスワードは(暗号的に)消えています。どのアルゴリズムについては


あなたが選ぶべき - 1現在受け入れ基準を使用します。

  • SHA-256

そして、あなたは、ユーザーのパスワードをハッシュするとき、またハッシュするようにしてくださいそれと他のいくつかのジャンクで。例えば:

  • パスワード:password1
  • 塩:PasswordSaltDesignedForThisQuestion

は、ユーザーのパスワードに塩を追加します。あなたは、独自の暗号化アルゴリズムを書かないでくださいどのような

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion"); 
+4

-1 SHA-256はパスワードハッシュ関数ではなく、この目的のために安全ではありません。それは* *(PBKDF2)の一部にすることができますが、それはまったく異なるものです。あなたの例は誤解を招きます。なぜなら、塩は巧妙なフレーズであってはならないから、ランダムな(ユーザごとの)値でなければならないからです。 –

7

。これを実行すると、(暗号化技術者でない限り)アルゴリズムに欠陥があり、クラックするのが簡単になることが保証されます。

+0

暗号化技術者であっても、おそらく欠陥があります。アルゴリズムが「一般的」になる前に何年ものレビューが必要です –

+1

これは本当です。そして、私は、ドン・クヌスと同様の逸話を思い起こさせてくれます。ずっと前に、彼は乱数ジェネレータを書こうと思っていました。最後に、彼はこの記念碑的な創造を実行し、それは無限に番号4を出しました。 (詳細は再入力時に変更されている可能性があります) – ndkrempel

2

bcryptを使用することを検討してください。これはlaravelのような多くの現代のフレームワークで使用されています。

関連する問題