安全なPHPアプリケーションを構築する場合、開発者はしばしばデータストレージ暗号化、ユーザーパスワード保護、データ送信暗号化などを含む暗号化のニーズに直面します。PHPは、Crypt()関数がパスワードハッシュに適しているさまざまな暗号化方法をネイティブにサポートします。
この記事では、 Crypt()およびOpenSSL_*関数を使用して、カスタム暗号化プロセスを構築して、パスワードハッシュセキュリティとデータ暗号化の柔軟性の両方を考慮します。
次の目標を達成したいと考えています。
ユーザーパスワードハッシュ- Crypt()を使用して、不可逆的なハッシュを実行します。
データ暗号化- OpenSSL対称暗号化アルゴリズムを使用して、ユーザーに敏感なデータを暗号化します。
キー保護- キーを生成および管理して、暗号化プロセスのセキュリティを確保します。
データの復号化- 正しいキーがある場合、暗号文はプレーンテキストに復元できます。
crypt()は、パスワードをハッシュするための関数です。パスワードハッシュ用の実証済みのアルゴリズムであるBCRYPTアルゴリズムを使用することをお勧めします。
function hash_password($password) {
$salt = '$2y$10$' . substr(str_replace('+', '.', base64_encode(random_bytes(16))), 0, 22);
return crypt($password, $salt);
}
パスワードの確認:
function verify_password($password, $hash) {
return crypt($password, $hash) === $hash;
}
電子メールやID番号などのユーザーに敏感なデータを暗号化するために、 AES-256-CBCなどのOpenSSLの対称暗号化方法を使用します。
function encrypt_data($plaintext, $key) {
$iv_length = openssl_cipher_iv_length('AES-256-CBC');
$iv = openssl_random_pseudo_bytes($iv_length);
$ciphertext = openssl_encrypt($plaintext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($iv . $ciphertext);
}
function decrypt_data($encrypted, $key) {
$data = base64_decode($encrypted);
$iv_length = openssl_cipher_iv_length('AES-256-CBC');
$iv = substr($data, 0, $iv_length);
$ciphertext = substr($data, $iv_length);
return openssl_decrypt($ciphertext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
}
openssl_random_pseudo_bytes()を使用して、セキュリティキーを生成できます。
function generate_secure_key($length = 32) {
return base64_encode(openssl_random_pseudo_bytes($length));
}
実際のプロジェクトでは、コードにハードコーディングされるのではなく、環境変数やキー管理サービスを使用するなど、安全な方法を使用してキーを保存する必要があります。
$password = 'myStrongPassword123!';
$hashed = hash_password($password);
if (verify_password('myStrongPassword123!', $hashed)) {
echo "パスワード検証が合格しました\n";
}
$key = base64_decode('pL2u0xJNzYX2+x5sK8Xt5c34BLTPWhMHn0h0snA4MlQ='); // サンプルキー
$secret = 'ユーザーメール: user@example.com';
$encrypted = encrypt_data($secret, $key);
$decrypted = decrypt_data($encrypted, $key);
echo "暗号化されたデータ: $encrypted\n";
echo "復号化されたデータ: $decrypted\n";
データ送信にはHTTPSを使用し、暗号化されたデータをプレーンテキストチャネルを介して送信しないでください。
キー管理はシステムセキュリティの中核であり、ハシコープボールトなどのセキュリティモジュールと協力することをお勧めします。
定期的にキーとアルゴリズムを回転させます。
暗号化キーをGitリポジトリまたはフロントエンドコードにハードコードしないでください。
暗号化プロセスとタイムリーなパッチの既知の脆弱性を定期的に監査します。
Crypt()とOpenSSL_*のこの組み合わせは、以下などのユーザー認証と機密データ暗号化が必要なシナリオに適しています。
銀行カード番号とIDカードの暗号化されたストレージ。
ユーザーチャットの履歴または個人情報を保護します。
マルチレイヤーセキュリティメカニズムを構築して、ユーザーのパスワードとデータを分離します。
背景の暗号化されたデータを定期的に自動的に復号化および分析します(主要な漏れの問題について非常に注意してください)。
Crypt()の不可逆的なハッシュ機能とOpenSSLの対称暗号化機能を組み合わせることにより、ユーザーのパスワード管理に適しており、データ暗号化ストレージのニーズを満たす比較的完全で安全な暗号化システムを確立できます。ビジネスニーズとセキュリティの脅威の進化により、このソリューションにはスケーラビリティも優れています。
より関連性の高い実装計画とベストプラクティスについては、次のような公式文書やコミュニティディスカッションプラットフォームにアクセスできます。