Daten aes-256 verschlüsselt in Datenbank speichern und wieder auslesen

Kalito

Erfahrenes Mitglied
Hallo, ich möchte gerne sensible Daten mit der aes-256 Verschlüsselung in eine Datenbank speichern.

PHP:
public static function encrypt($plain, $key, $hmacSalt = null)
    {
        self::_checkKey($key, 'encrypt()');

        if ($hmacSalt === null) {
            $hmacSalt = static::$_salt;
        }
        // Generate the encryption and hmac key.
        $key = mb_substr(hash('sha256', $key . $hmacSalt), 0, 32, '8bit');

        $crypto = static::engine();
        $ciphertext = $crypto->encrypt($plain, $key);
        $hmac = hash_hmac('sha256', $ciphertext, $key);

        return $hmac . $ciphertext;
    }

So wie ich es auch gelesen habe, habe ich das Datenbankfeld mit dem Typ Binary eingestellt. Jedoch schaffe ich es einfach nicht, dass der Eintrag in Klartext angezeigt wird. Entweder kommt Mist raus oder ein leerer String.

PHP:
public static function decrypt($cipher, $key, $hmacSalt = null)
    {
        self::_checkKey($key, 'decrypt()');
        if (empty($cipher)) {
            throw new InvalidArgumentException('The data to decrypt cannot be empty.');
        }
        if ($hmacSalt === null) {
            $hmacSalt = static::$_salt;
        }

        // Generate the encryption and hmac key.
        $key = mb_substr(hash('sha256', $key . $hmacSalt), 0, 32, '8bit');

        // Split out hmac for comparison
        $macSize = 64;
        $hmac = mb_substr($cipher, 0, $macSize, '8bit');
        $cipher = mb_substr($cipher, $macSize, null, '8bit');

        $compareHmac = hash_hmac('sha256', $cipher, $key);
        if (!static::_constantEquals($hmac, $compareHmac)) {
            return false;
        }

        $crypto = static::engine();

        return $crypto->decrypt($cipher, $key);
    }


Wenn ich z.Bsp. Test verschlüssele, kommt folgender binary-Wert raus (Anhang) Bei der entschlüsselung dieser bekomme ich entweder einen leeren String oder sowas in der Art zurück: "4f948f0956d00d2af04ea1abd299e335e06e01c1d5679bf2c35afba51896c8b9�m;k�v� s*_F��_D�n`ޞTq��"

Habt ihr eine Idee. woran es liegen könnte.
 

Anhänge

  • binary.PNG
    binary.PNG
    20,2 KB · Aufrufe: 2
Hi

erste Gegenfrage, kann das Problem auf die Funktionen da isoliert werden, oder ist evt. das Inserten/Lesen mit der DB ein Problem (Typen wie Binary sind nicht ganz so einfach zu handaben wie int und string)?
Bzw. wird es überhaupt mit der DB getestet, oder wird er Output der ersten Funktion einfach in die zweite gegeben?

Was macht static::engine() genau (Code)?

Zum Anwendungsfall, weil es selten gemacht wird: Hast du auch eine klare Idee davon, wie symmetrische Verschlüsselung einer DB dir hilft? (Weill damit nicht sagen, dass es generell nutzlos ist, aber ziemlich oft denken Leute "einfach noch eine Verschlüsselung, dann ist es sicher"...).

Und ein paar Anmerkungen zum Vorgang: Je nach Anwendungsfall ist ein Sha für Schlüsselerzeugung gut genug oder auch nicht - im Zweifelsfall eher etwas wie Pbkdf2 nehmen (was je nach Fall wieder zu langsam sein könnte - aber nur in bestimmten Fällen eben). Und der selbe Key für Verschlüsselung und Mac ist definitiv nicht zu empfehlen (auch wenns je nach Fall sicher sein kann)
 
Hallo,

ich verwende ein Framework, wo die oben genannten Funktionen schon hinterlegt sind. Von daher habe ich immer in die Datenbank geschrieben und das gespeicherte wieder ausgelesen und versucht zu decrypten. Ich werde es mal ohne Datenbankspeicherung probieren.

Meine Anwendung verwendetet einige Schnittstellen zu Drittsystemen. Da die Zugangsdaten benutzerspezifisch sind, wollte ich, dass der Nutzer seine Logindaten zu dem Drittsystem einträgt und ich diese in der Datenbank speichere. Damit diese aber nicht im Klartext in der DB stehen sollen, ich sie aber mitunter in Klartext benötige (Verbindung zu einem Mail-Postfach via php_imap) wollte ich eine zwei-Wege-Verschlüsselung.

Ich sehe aber gerade, dass das auch mit sha256 geht. Wäre aber unsicherer oder?
 
Nach langem hin und her habe ich eine Lösung gefunden. den aes-256-Verschlüsselten string codiere ich noch einmal mit base64. Somit kann ich das Ergebnis als String speichern. Ebenso der Rückweg: Erst base64_decode, dann den aes-256 entschlüsseln.
 
Zurück