Text verschlüsseln und entschlüsseln mit PHP

Wie kann ich Text in PHP mit einem Passwort verschlüsseln und wieder entschlüsseln?

In diesem Tutorial schauen wir uns an, wie wir Text ver- und entschlüsseln können in PHP. Für die Verschlüsselung und Entschlüsselung verwenden wir ein Passwort. Die Sicherheit der Verschlüsselung liegt damit in erster Linie an unserem Passwort. Dieses muss geheim bleiben und sollte ausreichend lang sein.

Die Funktionen zum Verschlüsseln und Entschlüsseln

Für die Verschlüsselung und Entschlüsselung verwenden wir folgende zwei Funktionen. Wir verwenden hier die OpenSSL-Funktionen von PHP für die Verschlüsselung. Die Funktionen ver- und entschlüsseln den Text mit dem übergebenen Passwort und kodieren das Ergebnis zudem noch mit Base64.

function encrypt($plaintext, $password) {
    $method = "AES-256-CBC";
    $key = hash('sha256', $password, true);
    $iv = openssl_random_pseudo_bytes(16);

    $ciphertext = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv);
    $hash = hash_hmac('sha256', $ciphertext . $iv, $key, true);

    return base64_encode($iv . $hash . $ciphertext);
}

function decrypt($encryptedText, $password) {
    $encryptedText = base64_decode($encryptedText);

    $method = "AES-256-CBC";
    $iv = substr($encryptedText, 0, 16);
    $hash = substr($encryptedText, 16, 32);
    $ciphertext = substr($encryptedText, 48);
    $key = hash('sha256', $password, true);

    if (!hash_equals(hash_hmac('sha256', $ciphertext . $iv, $key, true), $hash)) return null;

    return openssl_decrypt($ciphertext, $method, $key, OPENSSL_RAW_DATA, $iv);
}

Text mit PHP verschlüsseln

Zuerst verschlüsseln wir den Text:

$s = "Eine Katze kommt selten allein!";
$pass = "eumel";
$crypted = encrypt($s, $pass);
echo "Encrypted: ".$crypted."</br>\n";

In $crypted haben wir anschließend den verschlüsselten Text, z.B.:

Encrypted: yGGp0OdRa9MyhbKv1Fp6og97dBo1uglwU31+I1hAEz8bdL27U2CRdUKCtNNVcq9qanKbVvCF8g/nLP3Ael6yG9QCoUmag7/Nzvrldg4eLTY=

Text entschlüsseln

Der Text lässt sich mit dem richtigen Passwort auch wieder entschlüsseln.

$decrypted = decrypt($crypted, $pass);
echo "Decrypted again: ".$decrypted."<br>\n";

Die Rückgabe ist entweder der entschlüsselte Text oder “null”, falls das falsche Passwort übergeben worden ist.

$decrypted_false = decrypt($crypted, $pass_false);
if ($decrypted_false == nulL)
    echo "Wrong passphrase!<br>\n";

Download des Beispiels

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.