Kryptographie in PHP: Verschlüsselung und Hashing – vollständiger Leitfaden
In der modernen Webentwicklung ist Datensicherheit eine der obersten Prioritäten. PHP bietet leistungsstarke integrierte Werkzeuge für den kryptographischen Schutz: vom einfachen Passwort-Hashing bis zur komplexen asymmetrischen Verschlüsselung. In diesem Artikel behandeln wir die grundlegenden Ansätze, Bibliotheken und Best Practices für die Arbeit mit Kryptographie in PHP.
1. Daten-Hashing
Hashing ist die irreversible Umwandlung von Daten in eine Zeichenkette fester Länge. Es wird verwendet, um Passwörter zu speichern, die Integrität von Dateien zu überprüfen und digitale Signaturen zu erstellen.
1.1. Passwort-Hashing (password_hash)
Seit PHP 5.5 wird für das Passwort-Hashing die Verwendung der Funktion password_hash() empfohlen. Sie wählt automatisch einen sicheren Algorithmus (standardmäßig bcrypt) und generiert einen Salt.
<?php// Passwort hashen$password = 'MySecurePassword123!';$hash = password_hash($password, PASSWORD_DEFAULT);
echo "Hash: " . $hash . "";
// Passwort überprüfenif (password_verify($password, $hash)) { echo "Passwort ist korrekt!";} else { echo "Falsches Passwort!";}?>1.2. Hashing mit hash()
Für andere Zwecke (z. B. Prüfsummen von Dateien) verwenden Sie die Funktion hash() mit den Algorithmen SHA-256, SHA-512 oder BLAKE2.
<?php$data = "Geheime Daten";$sha256_hash = hash('sha256', $data);$blake2b_hash = hash('blake2b', $data);
echo "SHA-256: " . $sha256_hash . "";echo "BLAKE2b: " . $blake2b_hash . "";?>2. Symmetrische Verschlüsselung
Bei der symmetrischen Verschlüsselung wird derselbe Schlüssel zum Verschlüsseln und Entschlüsseln von Daten verwendet. In PHP wird dafür die OpenSSL-Erweiterung genutzt.
2.1. Verschlüsselung mit AES-256-GCM (authentifizierte Verschlüsselung)
Der empfohlene Modus ist AES-256-GCM, der Vertraulichkeit und Integritätsprüfung bietet.
<?php$plaintext = "Vertrauliche Nachricht";$key = random_bytes(32); // 256-Bit-Schlüssel$iv = random_bytes(12); // 96-Bit-Initialisierungsvektor
// Verschlüsselung$ciphertext = openssl_encrypt( $plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Verschlüsselte Daten (base64): " . base64_encode($ciphertext) . "";echo "Authentifizierungstag: " . bin2hex($tag) . "";
// Entschlüsselung$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Entschlüsselt: " . $decrypted . "";?>2.2. Verschlüsselung mit AES-256-CBC (für Kompatibilität)
Wenn Kompatibilität mit älteren Systemen erforderlich ist, verwenden Sie AES-256-CBC mit HMAC zur Integritätsprüfung.
<?phpfunction encryptAesCbc($plaintext, $key) { $iv = random_bytes(16); $ciphertext = openssl_encrypt($plaintext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv); $hmac = hash_hmac('sha256', $iv . $ciphertext, $key, true); return base64_encode($hmac . $iv . $ciphertext);}
function decryptAesCbc($data, $key) { $data = base64_decode($data); $hmac = substr($data, 0, 32); $iv = substr($data, 32, 16); $ciphertext = substr($data, 48); $expectedHmac = hash_hmac('sha256', $iv . $ciphertext, $key, true); if (!hash_equals($hmac, $expectedHmac)) { throw new Exception("Datenintegrität verletzt!"); } return openssl_decrypt($ciphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);}
$key = random_bytes(32);$encrypted = encryptAesCbc("Geheime Daten", $key);echo "Verschlüsselt: " . $encrypted . "";echo "Entschlüsselt: " . decryptAesCbc($encrypted, $key) . "";?>3. Asymmetrische Verschlüsselung
Die asymmetrische Verschlüsselung verwendet ein Schlüsselpaar: einen öffentlichen (zum Verschlüsseln)
Auch in der Bibliothek
Twilio für JavaScript (Node.js): Komplettguide mit Beispielen
Bildverarbeitung in C#: Größenänderung und Zuschneiden (Resize, Crop)
Arbeit mit S3 und Cloud-Speichern in JavaScript (Node.js) — die Bibliothek @aws-sdk/client-s3
charm/bubbletea Go: Komplettleitfaden mit Beispielen
Autorisierung und Authentifizierung in TypeScript: Vollständiger Leitfaden