Web開発では、ユーザーパスワードの安全なストレージは基本的かつ重要なタスクです。ただし、セキュリティ知識の人気が高まっているにもかかわらず、多くの開発者はMD5()関数を習慣的に使用して、初心者や単純なシステムを構築するときにユーザーのパスワードを暗号化および保存します。今日は、 MD5を使用してパスワードを保存するかどうか、そしてこの慣行の背後にある一般的な誤解があるかどうかについて説明します。
MD5()は、PHPに組み込まれたハッシュ関数であり、任意の長さの文字列を32文字の16進数文字列に変換できます。例えば:
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-string">'password123'</span></span><span>); </span><span><span class="hljs-comment">// 出力:482c811da5d5b4bc6d497ffa98491e38</span></span><span>
</span></span>
これは不可逆的なハッシュプロセスです(理論的に)。多くの初期の開発者は、それを使用して、ユーザーのプライバシーを保護すると信じて、ユーザーのパスワードをストレージに保存しました。
答えは、それは安全ではなく、ずっと前に排除されています。
主な理由は次のとおりです。
MD5()は、もともとデータの整合性を検証するために使用されるハッシュ関数として意図されており、その計算速度は非常に高速です。ただし、速度のため、ブルートフォース攻撃や虹のテーブル攻撃に非常に簡単に使用できます。
攻撃者は、特に一般的なパスワードや弱いパスワードに対する抵抗がほとんどないため、元のパスワードを推測するために、非常に短い時間で多数の組み合わせを試すことができます。
MD5()は決定論的関数です。同じ入力は常に同じ出力を生成します。これにより、2人のユーザーのパスワードが同じである場合、生成されるハッシュ値は同じであり、攻撃者は1回だけ亀裂する必要があり、複数のアカウントに適用できます。
塩のないハッシュ貯蔵方法は、虹のテーブルによって非常に簡単に分解できます。
MD5ハッシュおよびプレーンテキストパスワード用の多数のマッピングデータベースがインターネット上にあります。たとえば、 MD5( '123456')で得られたハッシュ値を検索エンジンに貼り付けるだけで、元のパスワードをすぐに見つけることができます。
PHPは、パスワード5.5から始まるPassword_hash()およびpassword_verify()関数を提供します。これらは現在、パスワードの暗号化と検証に推奨されている方法です。
サンプルコードは次のとおりです。
<span><span><span class="hljs-comment">// パスワードハッシュを生成します</span></span><span>
</span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-string">'password123'</span></span><span>, PASSWORD_DEFAULT);
</span><span><span class="hljs-comment">// パスワードを確認します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-string">'password123'</span></span><span>, </span><span><span class="hljs-variable">$hash</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'パスワードを修正します'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'エラーパスワード'</span></span><span>;
}
</span></span>
password_hash()は、デフォルトでBCRYPTアルゴリズムを使用し、ランダム塩値を自動的に生成します。ブルートフォースの割れや虹のテーブル攻撃と戦うための組み込みメカニズムがあります。
自動塩の追加
構成可能な計算強度(コスト係数)
スケーラブル(Argon2などのさまざまなアルゴリズムをサポート)
公式のメンテナンスは、最新のパスワードストレージ基準に準拠しています
MD5()を使用してパスワードを保存することは時代遅れで危険であり、初期のプロジェクトではより一般的ですが、今日は安全ではありません。サイバー攻撃方法が引き続きアップグレードされているため、開発者は古いセキュリティの概念を放棄し、より近代的で安全な方法を使用してユーザーパスワードを処理する必要があります。
覚えておいてください:セキュリティは「暗号化」に依存するのではなく、設計に依存します。
Password_hash()を採用し、 MD5()を拒否することは、ユーザーの安全に対する最も基本的な尊重です。