重複の可能性:
PHPパスワードの安全なハッシュとソルト
ユーザーのクレデンシャル(電子メール、ユーザー名、パスワード)をMySQLデータベースに保存するシステムを作成していますが、暗号化、ソルティング、および暗号化タイプの使用に関して矛盾する見解が見られます。
あなたがお勧めする最良の方法は何ですか?MD5またはSHA1でエンコードしますか?塩漬けか塩漬けしないか?パスワードだけを暗号化するのか、それとも3つの要素すべてを暗号化するのか?
重複の可能性:
PHPパスワードの安全なハッシュとソルト
ユーザーのクレデンシャル(電子メール、ユーザー名、パスワード)をMySQLデータベースに保存するシステムを作成していますが、暗号化、ソルティング、および暗号化タイプの使用に関して矛盾する見解が見られます。
あなたがお勧めする最良の方法は何ですか?MD5またはSHA1でエンコードしますか?塩漬けか塩漬けしないか?パスワードだけを暗号化するのか、それとも3つの要素すべてを暗号化するのか?
IMOのベストプラクティスは次のとおりです。
SHA256やSHA512などのハッシュアルゴリズムを使用します。ハッシュを元に戻したり、レインボー攻撃を実行したりできるため、MD5は安全ではなくなりました。
強力なソルトを使用して、攻撃者がデータベースへのエントリを取得した場合に、一般的にハッシュされたパスワードを推測できないようにします。
暗号化は使用しないでください。
パスワード、ユーザー名、および電子メールのみをハッシュして、プレーンテキストとして問題ありません。
暗号化する必要があるのは、実際にはパスワードだけです。現実的には、少なくともSHA-256のアルゴリズム(MD5とSHA1はクラック可能だと確信していますか?)とHashing
パスワードの両方が非常に安全である必要があります(エンコードと言うときはそういう意味です) 。 Salting
それらを保存するための好ましい方法に関する答えは次のとおりです。データベースにパスワードを保存するための好ましい方法
ユーザー名と電子メールは暗号化しないでください。プレーンテキストである必要があります。そうすれば、より便利になります。
パスワードに関しては、絶対に暗号化またはハッシュ化する必要があります。できればソルトも使用する必要があります。これまで、私はこれを行うためにやや興味深い手法を使用していました。AES、そのキーはパスワード自体です。したがって、ユーザーが自分のパスワードを「blabla123」にすると、を呼び出してMySQLに保存しますAES_ENCRYPT('blabla123', 'blabla123')
。これには2つの利点があります。
有効性は、ユーザーが入力した内容を暗号化し、2つの値を比較することによって行われます。
レインボーテーブルを使用した攻撃を防ぐために、パスワードは強力なソルト(MD5またはSHA1のいずれかで問題ありません)でハッシュすることによって保護する必要があります。
メールアドレスをハッシュしないでください。ハッシュするとすぐに、ユーザーが入力した内容を確認する以外の目的で使用できなくなるため、ハッシュ化するとその人にメールを送信できなくなります。同様に、ユーザー名は、その人を識別できるようにプレーンテキストで保存するのが最適です。