openssl_encrypt in Datenbank vergleichen

isaack

Mitglied
Hallo,

ich habe da mal wieder eine Frage.
ich habe in meiner Datenbank, Daten wie E-Mail Adresse ect verschlüsselt mit openssl_encrypt stehen.
Jetzt wollte ich auch eine Passwort vergessen function dazu schreiben und stehe vor dem Probelm, das ja openssl_encrypt immer wieder einen anderen Wert ausgibt und ich dies nicht mit dem in der Datenbank stehenden Daten abgleichen kann per PHP.
In der Datenbank steht das ganze bereits verschlüsselt und mit base64 gespeichert.

meine PHP function sieht wie folgt aus:
PHP:
function verschluesseln($text){
        $ivlen = openssl_cipher_iv_length($cipher="AES-128-CBC");
        $iv = openssl_random_pseudo_bytes($ivlen);
        $ciphertext_raw = openssl_encrypt($text, $cipher, SCHLUESSEL_PW, $options=OPENSSL_RAW_DATA, $iv);
        $hmac = hash_hmac('sha256', $ciphertext_raw, SCHLUESSEL_PW, $as_binary=true);
        $ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
        return $ciphertext;
    }

daher meine frage, gibt es den bei mysql eine möglichkeit die daten zu vergleichen oder muss ich die mail adresse etc im klartext speichern?

Danke schonmal für die antworten.
 
stimmt *facepalm* daran habe ich ja gar nicht gedacht.
danke für den hinweiß.

dachte aber das man da in der where abfrage dann arbeiten kann mit einem
Code:
base64_decode(AES_DECRYPT(description,'passw'))

als beispiel.
aber sollte das nicht gehen, dann werde ich wohl einen festen wert nehmen.
 
Du kannst doch pro Nutzer einen festen IV nehmen (wie Salts). Ich weiß allerdings gar nicht, ob das kryptographisch sinnvoll ist.

Hat jemand mehr Kenntnise über Kryptographie? Ansonsten mal auf Crypto.SE fragen.
 
Gibt es einen besonderen Grund, warum du die E-Mail Adresse nicht im Klartext speicherst?

In der Regel speichert man in der Datenbank 3 Dinge für jeden Benutzer:
1) Die E-Mail Adresse
2) Einen Salt (zufällig bei der Accounterstellung generierter Wert)
3) Einen Hash von (Passwort + Salt)
Der Server kann damit einen Login-Versuch mit Email+Passwort validieren.

Das sind so die einfacheren Login-Systeme (alles was noch einfacher ist, ist auch nicht sicher!). Spricht etwas dagegen, dass du so ein Login-System verwendest? Man könnte es bei Bedarf auch noch sicherer machen...

Gruß Technipion
 
Achso, jetzt fällt mir ein, dass du möglicherweise das Nutzer-PW "nur" verschlüsseln wolltest und nicht dessen Hash verschülsseln wolltest. In dem Fall kann jeder, der deine DB und dein Master-PW stiehlt, auch jedes Nutzer-PW einsehen.
Außerdem sollte das reversible Speichern von PWs gar nicht vonnöten sein für eine "PW vergessen"-Funktion. Man kann halt das PW dem Nutzer nicht mehr mitteilen, das sollte man aber sowieso nicht mehr.

Siehe auch https://plaintextoffenders.com/. (Leider ein Zertifikatfehler aktuell.)
 
Zurück