質問
パスワードを暗号化するための最も速くて安全な方法は何ですか (PHP を推奨します)。どの方法を選択しても、それは移植可能ですか?
言い換えれば、後で Web サイトを別のサーバーに移行した場合、パスワードは引き続き機能しますか?
言われたとおりに私が現在使用している方法は、サーバーにインストールされているライブラリの正確なバージョンに依存します。
解決
ログイン システムに暗号化方式を選択する場合、速度は友人ではありません。ジェフはパスワードと 結論 つまり、許容できる範囲で最も低速で最も安全な暗号化方式を使用する必要があるということです。
Thomas Ptacek のブログより:
パスワード ハッシュ関数に望ましくないのはまさに速度です。最新のパスワード スキームは、増分パスワード クラッカーによって攻撃されます。
増分クラッカーは、クラックされる可能性のあるすべてのパスワードを事前に計算するわけではありません。彼らは各パスワード ハッシュを個別に考慮し、PHP ログイン ページと同じ方法でパスワード ハッシュ関数を通じて辞書をフィードします。Ophcrack のようなレインボー テーブル クラッカーは、スペースを使用してパスワードを攻撃します。John the Ripper、Crack、LC5 などの増分クラッカーは、時間の経過とともに機能します。統計と計算。
パスワード攻撃ゲームは、パスワード X を解読するのにかかる時間でスコアが計算されます。レインボー テーブルの場合、その時間は、必要なテーブルの大きさと、テーブルを検索できる速度によって異なります。インクリメンタル クラッカーの場合、時間はパスワード ハッシュ関数をどれだけ速く実行できるかによって決まります。
パスワード ハッシュ関数をより適切に最適化できれば、パスワード ハッシュ関数の速度は速くなり、スキームは弱くなります。MD5 と SHA1、さらには DES などの従来のブロック暗号も高速になるように設計されています。MD5、SHA1、DES は弱いパスワード ハッシュです。最新の CPU では、DES や MD5 などの生の暗号ビルディング ブロックをビットスライス、ベクトル化、並列化して、パスワード検索を超高速に行うことができます。ゲームオーバー FPGA 実装のコストはわずか数百ドルです。
他のヒント
私はピーターと一緒です。開発者はパスワードを理解していないようです。私たちは皆、速いという理由で MD5 または SHA1 を選択します (そして私にも罪があるのですが)。考えてみると(最近誰かがそれを指摘してくれたので)それは意味がありません。バカみたいに遅いハッシュ アルゴリズムを選択する必要があります。つまり、物事の規模で言えば、忙しいサイトがパスワードをハッシュすることになるでしょうか?1/2分ごと?サーバー的には 0.8 秒かかるか、0.03 秒かかるかなんて誰が気にするでしょうか?しかし、この余分な速度の遅さは、あらゆる種類の一般的なブルートフォース攻撃を防ぐのに非常に役立ちます。
私の読んだところによると、bcrypt は安全なパスワード ハッシュ用に特別に設計されています。これはBugをベースにしており、多くの実装があります。
PHP については、PHPPass を確認してください。 http://www.openwall.com/phpass/
.NET を使用している人は、BCrypt.NET をチェックしてください。 http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx
そうしたくないことを指摘しておく必要があります 暗号化する パスワード、あなたがしたい ハッシュ それ。
暗号化されたパスワードは復号化され、他人にパスワードを見られる可能性があります。ハッシュは一方向の操作であるため、ユーザーの元のパスワードは(暗号的に)失われます。
どのアルゴリズムを選択する必要があるかについては、現在受け入れられている標準のものを使用してください。
- SHA-256
ユーザーのパスワードをハッシュするときは、必ず他のジャンクも一緒にハッシュしてください。例えば。:
- パスワード:
password1
- 塩:
PasswordSaltDesignedForThisQuestion
ユーザーのパスワードにソルトを追加します。
String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
何をする場合でも、独自の暗号化アルゴリズムを作成しないでください。これを行うと、(あなたが暗号学者でない限り) アルゴリズムに欠陥が存在し、解読が簡単になることがほぼ確実になります。
使用を検討してください bcrypt
これは、laravel のような多くの最新のフレームワークで使用されています。
必ずしも最速を求めているわけではありませんが、バランスが取れています。このコードが開発されているサーバーの一部はかなり遅く、パスワードをハッシュして保存するスクリプトの実行には 5 ~ 6 秒かかります。それをハッシュに絞り込みました(ハッシュをコメントすると、1〜2秒で実行されます)。
最も安全である必要はありません。私は(今のところ)銀行のためにお金を払っているわけではありませんが、間違いなく安全です しない パスワードを平文で保存します。
password_hash ( string $password , int $algo [, array $options ] )
. 。(PHP 5 >= 5.5.0、PHP 7)
password_hash() は、強力な一方向ハッシュ アルゴリズムを使用して新しいパスワード ハッシュを作成します。password_hash() は crypt() と互換性があります。したがって、crypt() によって作成されたパスワード ハッシュは、password_hash() で使用できます。