Kryptographie in PHP: Verschlüsselung und Hashing (praktischer Leitfaden)

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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

Empfehlungen