Kryptographie in PHP: Verschlüsselung und Hashing von Daten
In der modernen Webentwicklung ist Datensicherheit keine Option, sondern eine zwingende Anforderung. PHP bietet ein leistungsstarkes Arsenal an Werkzeugen für den kryptographischen Schutz, das sich in zwei Hauptbereiche unterteilt: Verschlüsselung (umkehrbare Datenumwandlung) und Hashing (nicht umkehrbare Umwandlung). In diesem Artikel betrachten wir die wichtigsten Bibliotheken und Funktionen von PHP für beide Aufgaben mit praktischen Beispielen.
1. Grundlegende Konzepte der Kryptographie in PHP
Bevor wir zum Code übergehen, ist es wichtig, zwei Arten von Operationen zu unterscheiden:
- Verschlüsselung — Datenumwandlung mit der Möglichkeit, den Originaltext mit einem Schlüssel wiederherzustellen. Wird zur Übertragung vertraulicher Informationen verwendet.
- Hashing — eine einseitige Umwandlung, bei der die Originaldaten nicht wiederhergestellt werden können. Wird zur Speicherung von Passwörtern und zur Integritätsprüfung verwendet.
PHP verwendet die Erweiterungen openssl (für Verschlüsselung) und password_hash/hash (für Hashing).
2. Datenverschlüsselung in PHP
2.1. Symmetrische Verschlüsselung (AES)
Der beliebteste Algorithmus ist AES-256-GCM, der hohe Leistung und integrierte Authentifizierung bietet.
<?php// Verschlüsselung$data = "Geheime Nachricht";$key = openssl_random_pseudo_bytes(32); // 256-Bit-Schlüssel$iv = openssl_random_pseudo_bytes(12); // 96-Bit-Vektor für GCM
$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
// Kodierung in base64 zur Übertragung$encrypted_base64 = base64_encode($iv . $tag . $encrypted);
// Entschlüsselung$decoded = base64_decode($encrypted_base64);$iv = substr($decoded, 0, 12);$tag = substr($decoded, 12, 16);$ciphertext = substr($decoded, 28);
$decrypted = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "Entschlüsselt: " . $decrypted; // Geheime Nachricht?>Wichtig: Verwenden Sie niemals den ECB-Modus — er ist unsicher. Verwenden Sie immer GCM oder CBC mit HMAC.
2.2. Asymmetrische Verschlüsselung (RSA)
Für Schlüsselaustausch und digitale Signaturen wird RSA verwendet. PHP nutzt ein Schlüsselpaar (öffentlich/privat).
<?php// Schlüsselgenerierung$config = [ "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA,];$res = openssl_pkey_new($config);openssl_pkey_export($res, $privateKey);$publicKey = openssl_pkey_get_details($res)['key'];
// Verschlüsselung mit öffentlichem Schlüssel$data = "Vertrauliche Daten";openssl_public_encrypt($data, $encrypted, $publicKey);
// Entschlüsselung mit privatem Schlüsselopenssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo $decrypted; // Vertrauliche Daten?>3. Passwort-Hashing
Passwort-Hashing ist eine kritisch wichtige Aufgabe. PHP bietet spezialisierte Funktionen, die automatisch Salt und Rechenaufwand wählen.
3.1. bcrypt (standardmäßig empfohlen)
Die Funktion password_hash() mit dem Algorithmus PASSWORD_BCRYPT erstellt einen sicheren Hash mit automatischem Salt.
<?php$password = "UserPassword123!";
// Hashing$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);echo "Hash: " . $hash . ""; // $2y$12$...
// Überprüfungif (password_verify($password, $hash)) { echo "Passwort ist korrekt!";} else { echo "Falsches Passwort";}
// Prüfung auf erneutes Hashingif (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);}?>3.2. Argon2 (moderner Standard)
Ab PHP 7.2
Auch in der Bibliothek
PDF-Erstellung in JavaScript (Node.js): Bibliotheken und Werkzeuge
iText 7 für Java: Komplette Anleitung mit Praxisbeispielen