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

4 Kommentare

  1. Hallo,

    eine Frage an die php-Spezilisten:

    Nach meinem Verständnis können Webseiten-Besucher auch nur mit TCP getrackt werden. Beispiele waren vor einigen Jahre “Kissmetrics” und “Hulu” (z.B. https://www.wired.com/2011/07/undeletable-cookie/)

    Um zu prüfen, wie man erkennen kann, ob das heute noch eingesetzt wird, wäre eine Test-Installation nötig.
    Ein kleiner Test zeigte, dass bei vielen Webseiten die ETags manipuliert werden, aber ob zum tracken oder aus “legitiemen” Gründen ist schwer zu beurteilen.

    Würde Euch so ein Thema interessieren?

  2. Gibt es eine Möglichkeit, daß der Ver-Schlüssel (encryption password) sich vom Ent-Schlüssel (decryption password) völlig unterscheidet?
    Oder wie muß ich das anstellen, daß ein Einbrecher/Hacker in meinem Verschlüsselungsskript das Entschlüsselungs-Paßwort nicht findet?
    (Oder mache ich da einen Denkfehler?)

Kommentar hinterlassen

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