PHPのCrypt()関数は、文字列を暗号化するためのコア関数です(通常はパスワード)。これは、システムの基礎となる暗号化アルゴリズムに基づいており、入力文字列をハッシュして、パスワードの安全なストレージと検証を実現します。 Crypt()関数の基本的な使用と目的はPHPバージョン全体で一貫していますが、PHPおよびオペレーティングシステムのバージョンが変更されるにつれて、その内部実装とサポートされたアルゴリズムにはいくつかの重要な違いがあります。これらの違いは、パスワードのセキュリティとアプリケーションの互換性に直接影響し、それらを理解することは、安全で安定したアプリケーションを開発するために不可欠です。
crypt()は2つのパラメーターを受け入れます。
$hashed_password = crypt($password, $salt);
$パスワードは、平文パスワードまたは任意の文字列です。
$塩は、暗号化アルゴリズムの塩値を制御するために使用されます。異なる形式は、暗号化アルゴリズムの選択を決定します。
返品値は、暗号化された文字列です。パスワードを確認するとき、同じ塩を使用して、パスワードを再クリックして結果が一貫しているかどうかを比較します。
初期のPHPバージョン(PHP 4.X、PHP 5.2以降)
システムによって提供される標準的なデス暗号のみ(56ビットキーに基づいて、塩は2文字です)、セキュリティは低いです。
提供された塩形式が間違っている場合、 crypt()はデン暗号化の使用に縮退します。
PHP 5.3以降
MD5などのより近代的な暗号化アルゴリズムのサポートを開始します(塩形式は$ 1 $で始まります)、
Blowfishもサポートされています(塩形式は、PHPバージョンに応じて2A $または$ 2Y $で始まります)、
SHA-256( $ 5 $ )やSHA-512( $ 6 $ )などのアルゴリズムが、オペレーティングシステムのLIBCライブラリがサポートすることを規定しています。
Php 7.x
ブローフィッシュのサポートを改善し続け、歴史の中でいくつかのセキュリティの脆弱性を修正し続けます( $ 2A $の影響など)
PHP 7.3は、後にブローフィッシュのより安全なバージョンである$ 2Y $タグを導入しました。
さまざまなシステムのサポートはより高く、より多くのアルゴリズムがサポートされています。
Php 8.x
上記のアルゴリズムのサポートを維持し、セキュリティと互換性に注意してください。
PHPのネイティブパスワードHash Functions password_hash()とpassword_verify()を使用することをお勧めしますが、 crypt()は引き続き利用可能です。
Crypt()機能は、実際にオペレーティングシステムのLIBCライブラリ(GNU LIBC、BSD LIBCなど)に依存して、暗号化操作を完了するため、次のようになります。
サポートされているアルゴリズムは、異なるオペレーティングシステム(Linux、FreeBSD、Windows)で同じPHPバージョンで完全に一貫していない場合があります。
WindowsでのCrypt()サポートは非常に限られており、通常は従来のデス暗号のみをサポートしています。
Linuxは通常、LIBCバージョンに応じて複数のアルゴリズムをサポートします。
異なる暗号化アルゴリズム間にセキュリティに大きなギャップがあります。初期の暗号化アルゴリズムは簡単にクラックされ、生産環境ではもはや使用されなくなりました。最新のアルゴリズム(BlowFish、SHA-512など)をサポートするPHPバージョンとオペレーティングシステムは、パスワードストレージのセキュリティを大幅に改善できます。
アプリケーションがCrypt()に依存し、塩形式を明示的に指定していない場合、PHPバージョンのアップグレードまたはオペレーティングシステムの移行時にパスワード検証の障害が発生する可能性があります。
たとえば、古いシステムはDESでのみ暗号化され、移行後にSHA-512になり、新しいシステムが古いパスワードを正しく検証することができません。
したがって、アプリケーションで塩形式を明示的に指定するか、より最新のパスワード処理インターフェイスを採用することをお勧めします。
PHPの公式は、バージョン5.5にpassword_hash()とpassword_verify()を導入し、パスワードの暗号化と検証の詳細をカプセル化しました。
$hash = password_hash($password, PASSWORD_DEFAULT); // デフォルトで使用されます bcrypt
if (password_verify($password, $hash)) {
echo "パスワード検証が成功しました";
}
このインターフェイスは、優れた互換性と高いセキュリティを備えており、最も安全なアルゴリズムを自動的に選択できます。
Crypt()を直接使用することの複雑さと互換性の問題を避けてください。
将来のバージョンでは、 Crypt()を直接呼び出すのではなく、このソリューションが推奨されます。
次の例は、異なる塩でcrypt()を呼び出す方法を示しており、暗号化の結果の違いを示しています。