PHPの地下機能は、文字列を暗号化するために使用されます。異なる暗号化アルゴリズム(DES、BlowFish、MD5など)に基づいて暗号化結果を生成します。 Crypt関数は、パスワードデータを処理するためによく使用されます。これは、塩値でパスワード暗号化のセキュリティを強化できるため、レインボーテーブル攻撃などの一般的な攻撃方法を防ぐことができます。
<span><span><span class="hljs-title function_ invoke__">crypt</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$salt</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
$ strは、暗号化するplantext文字列(ユーザーが入力したパスワードなど)です。
$塩は、パスワードのセキュリティを増やすために使用されるランダムな文字列です。異なる暗号化アルゴリズムには、異なる塩形式が必要です。
返品値は暗号化された文字列です。
まず、 Crypt関数を使用してユーザーが入力したパスワードを暗号化する方法を示す簡単な例を見てみましょう。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ユーザーが入力したパスワード</span></span><span>
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">"userpassword"</span></span><span>;
</span><span><span class="hljs-comment">// 使用 DES 暗号化アルゴリズム,塩値を指定します</span></span><span>
</span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-string">"<span class="hljs-subst">$1</span></span></span><span>$".</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>()), </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">8</span></span><span>); </span><span><span class="hljs-comment">// 使用 MD5 ランダム塩値を生成するします</span></span><span>
</span><span><span class="hljs-variable">$encrypted_password</span></span><span> = </span><span><span class="hljs-title function_ invoke__">crypt</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>);
</span><span><span class="hljs-comment">// 出力暗号化の結果</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Encrypted Password: "</span></span><span> . </span><span><span class="hljs-variable">$encrypted_password</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
この例では、MD5暗号化アルゴリズムを表すために$ 1 $を使用します(これはCryptの標準形式です)。暗号化の複雑さは、パスワードに塩値を追加することにより追加されます。
塩の値は、暗号化プロセスの非常に重要な部分です。同じパスワードが同じ暗号化の結果を2回生成するのを効果的に防ぐことができます。毎回異なる塩値を使用することにより、2人のユーザーのパスワードが同じであっても、暗号化の結果が異なり、パスワードをクラックすることの難しさを大幅に増加させます。
地下室機能では、塩値を慎重に設計して、十分なランダム性を確保する必要があります。塩の値は、塩値としてユーザー名や固定文字列を使用するなど、あまり単純ではありません。
PHP Crypt Functionは、さまざまな暗号化アルゴリズムをサポートしています。
des ( $ 1 $はmd5暗号化を意味します)
blowfish ( $ 2a $はブローフィッシュ暗号化を意味します)
SHA-256 ( $ 5 $はSHA-256暗号化を意味します)
SHA-512 ( $ 6 $はSHA-512暗号化を意味します)
その中で、SHA-256とSHA-512は高い暗号化強度を提供します。これは、パスワードの高強度暗号化に適しています。暗号化のセキュリティを確保するには、これら2つのアルゴリズムのいずれかを可能な限り選択することをお勧めします。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">"userpassword"</span></span><span>;
</span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-string">"<span class="hljs-subst">$2y</span></span></span><span><span class="hljs-subst">$10</span></span><span>$".</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>()), </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">22</span></span><span>); </span><span><span class="hljs-comment">// 生成する Blowfish 塩値</span></span><span>
</span><span><span class="hljs-variable">$encrypted_password</span></span><span> = </span><span><span class="hljs-title function_ invoke__">crypt</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Encrypted Password (Blowfish): "</span></span><span> . </span><span><span class="hljs-variable">$encrypted_password</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
パスワードを暗号化した後、ユーザーがログインしたときにパスワードを確認する方法は?暗号化されたパスワードをデータベースに保存できます。ユーザーがログインすると、暗号化の結果が一致するかどうかを確認するために、ユーザーが入力したパスワードを暗号化します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// データベースから取得した暗号化されたパスワードがと仮定します</span></span><span>
</span><span><span class="hljs-variable">$stored_encrypted_password</span></span><span> = </span><span><span class="hljs-string">"<span class="hljs-subst">$2y</span></span></span><span><span class="hljs-subst">$10</span></span><span><span class="hljs-subst">$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span></span><span>"; </span><span><span class="hljs-comment">// 事前に保存された暗号化パスワード</span></span><span>
</span><span><span class="hljs-comment">// ユーザーが入力したプレーンテキストパスワード</span></span><span>
</span><span><span class="hljs-variable">$user_input_password</span></span><span> = </span><span><span class="hljs-string">"userpassword"</span></span><span>;
</span><span><span class="hljs-comment">// 使用相同的塩値对ユーザーが入力したパスワード进行加密</span></span><span>
</span><span><span class="hljs-variable">$encrypted_input_password</span></span><span> = </span><span><span class="hljs-title function_ invoke__">crypt</span></span><span>(</span><span><span class="hljs-variable">$user_input_password</span></span><span>, </span><span><span class="hljs-variable">$stored_encrypted_password</span></span><span>);
</span><span><span class="hljs-comment">// 暗号化されたパスワードが一致するかどうかを比較します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$encrypted_input_password</span></span><span> === </span><span><span class="hljs-variable">$stored_encrypted_password</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</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">"Password is incorrect!"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
暗号化プロセスのセキュリティを確保するために、陰謀能機能の合理的な使用に加えて、次のベストプラクティスに従う必要があります。
強い塩の値を使用します。塩の値は、十分にランダムで十分に長い必要があります(たとえば、22ビット)。ユーザー名や電子メールアドレスなどの簡単な文字列を使用しないでください。
適切な暗号化アルゴリズムを使用:SHA-256やSHA-512などの最新の暗号化アルゴリズムが推奨されます。弱いデス暗号を避けてください。
塩の値の再利用を避ける:各パスワードは、虹のテーブル攻撃を避けることができる一意の塩値を使用する必要があります。
暗号化されたパスワードを保存:データベースにプレーンテキストパスワードを保存しないでください。暗号化されたパスワードを保存する必要があり、入力されたパスワードは、検証中に暗号化された同じ塩値と比較する必要があります。
暗号化方法の定期的な更新:コンピューティングパワーが増加すると、一部の暗号化アルゴリズムが脆弱になる可能性があるため、暗号化方法を定期的に評価および更新する必要があります。