Mit welchem Hash oder Verschlüsselung sollte eine E-Mail Adresse in einer Datenbank gespeichert werden?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Passwörter sollten niemals in einer DB gespeichert werden. Ein Salted-Hash erreicht das selbe, solange (dir) der Salt und der Hash Algorithmus bekannt sind. Wenn jetzt der Benutzer sein PW eingibt, kannst du den (salted) Hash von der Eingabe berechnen und mit dem Wert in der DB abgleichen.

Im Idealfall ist es aber in die andere Richtung nicht möglich. So kann (sollte) niemals vom Hash auf das PW geschlossen bzw. "zurückgerechnet" werden.

Wenn du jetzt auch nur den Hashwert der Mail-Adressen speicherst, wie willst du dann später wieder an die Adresse kommen?

Bei einem HASH sollte das nicht möglich sein!

Selbst wenn du dafür einen passablen Weg findest, hat dein Server dann eine Menge (unnötig) zu tun, wenn er bei 10.000 oder mehr Adressen erst die Adresse herausfinden soll und erst dann eine Email senden kann.

Und lass auf jeden Fall die Finger von SHA-1 oder MD5!

Diese gelten als gecknackt!

Deine Lösung:

Wie triopas schon gesagt hat:

Sichere lieber deine Datenbank gut gegen SQL-Injection
und speichere die eMail im Klartext. Ich mein Username
usw ist ja auch Klartext.. Alles andere ist Unsinn..
Elgatos 
Fragesteller
 22.08.2016, 18:46

Hi tDoni,

vielen Dank für deine Antwort und die Nebeninfo über SHA-1 und MD5.

Du hast gemeint, dass Passwörter niemals in einer Datenbank gespeichert werden sollten. Wenn Passwörter nicht in einer Datenbank gespeichert werden sollten, wie soll die Formulareingabe dann abgeglichen werden? Dort besteht ja dann gar keine Vergleichsmöglichkeit, weil das gesetzte Passwort gar nicht gespeichert wurde. Oder meinst du, dass Passwörter niemals als Klartext, sondern immer verschlüsselt und sicher gespeichert werden sollten? Das wäre ja selbstverständlich. Ich denke mal, das meinst du auch so bzw. hast das so gemeint. Oder?^^

Ein Hash soll letztendlich gar nicht zurückgerechnet werden, oder? Es soll etwas "verschlüsselt" werden, nicht jedoch wieder "entschlüsselt"? So hab ich das zumindest verstanden.

Die E-Mail Adressen werden dann wohl im Klartext gespeichert.

0
tDoni  22.08.2016, 19:03
@Elgatos

Schau dir mal kurz die Seite hier an: http://hashgenerator.de/

Ich bleibe bei dem Beispiel mal bei SHA-1. Verwende im Livesystem aber auf jeden Fall einen anderen Hash-Algo!

Beispiel:

Ein User meldet sich an mit

  • Mail: mail@example.com
  • PW: password
  • Name: name

Dann speicherst du den namen und die mail ab. 1:1

Mit dem Passwort stellen wir ein paar Berechnungen an:

Der Hash würde dafür ergeben:

  • 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

Wenn du jetzt dem Datensatz aber noch eine ID mit gibst, z.B. 5,

kannst du das Passwort verändern, "salzen".

Zum Beispiel:

  • salted pw: password5
  • hash: edba955d0ea15fdef4f61726ef97e5af507430c0

Sieht also kommplett anders aus.

Du speicherst dir dann die ID (den salt) ab und den Hashwert, nicht das Passwort!

Wenn sich der Benutzer jetzt wieder anmelden will, gibt er sein Passwort ein. Du kannst den dafür passenden Salt auslesen. Damit dann das salted Passwort generieren (hier: password5). Davon generierst du dann den HASH-Wert und gleichst diesen mit dem Wert in der DB ab.

Das PW selbst ist dabei kein einziges mal in der DB gelandet.

Wenn jetzt auch noch ein Benutzer 6 das selbe PW angibt, ergibt sich das salted PW password6. Der Hash dafür sieht wieder ganz anders aus:

6d749e8a378a34cf19b4c02f7955f57fdba130a5

Beachte dabei, dass du für jeden Wert auch einen anderen Salt verwendest, und diesen am besten auch nicht so simple wie in diesem Beispiel. (Zum Beispiel zufallszeichenfolge in einer extra tabellenspalte/Tabelle oder besser gleich anderer DB, das Datum der registrierung, eine unique ID etc.

Sei kreativ und sorge dafür, dass niemand an deinen Salting Algo kommt. Und in die DB ;)



0
Elgatos 
Fragesteller
 23.08.2016, 13:38
@tDoni

Hi,

danke für die ausführliche Erklärung.

Also landet letztendlich nur der Salt an sich und das "gesalzene Passwort" als Hash in der Datenbank, nicht aber das "normal-gehashte"-Passwort. Korrekt?

Woher weiß das Skript denn, welcher Salt zu welchem User gehört? Oder wird das eingebene, bestehende Kennwort mit den vorhandenen Saltwerten kombiniert (nach Such-Verfahren) und falls es eine Übereinstimmung gibt, wird der User eingeloggt?

Und password_hash ist vom Grundsatz her ausreichend und sicher, oder? (http://php.net/manual/de/function.password-hash.php)

Grüße

0
tDoni  23.08.2016, 15:27
@Elgatos

Jup. So siehts aus.

Das Passwort landet NIEMALS in der DB. Der HASH vom (ungesalzenem) Passwort auch nicht!

Lediglich der HASH des versalzenen PW landet dort.

Woher oder wie du den Salt generierst, entscheidest du. Wichtig ist, dass niemand sonst diesen Weg kennt.

Wie gesagt, du kannst die ID des Users mit verwenden, du kannst den timestamp bei der registrierung mit abspeichern oder du generierst für jeden User einen zusätzlichen random String, den du für diesen einen User als Salz verwendest. (Vielleicht dann aber besser in einer anderen Tabelle speichern, also nicht direkt in der Spalte neben dem Hash ;) )
Wie  und wo du das PW dann "versalzst" hängt auch von dir ab. Hinten anhängen, vorne anhängen, mittendrin irgendwie... such dir was tolles aus ;)

Ich habe mit der Funktion password_hash  noch nie gearbeitet. Aber ich gehe davon aus, dass sie OK ist.

Ein weiterer Vorteil der Hashe ist, dass sie alle gleich lang sind. Sollte ein Angreifer doch die DB kapern, kann er nicht einmal auf die Länge es ursprünglichen PW schließen.

0
Elgatos 
Fragesteller
 23.08.2016, 17:06
@tDoni

Hi tDoni,

vielen Dank für die Erklärung! :) Jetzt hab ichs verstanden :D

Welchen Hash-Algorithmus sollte man deiner Meinung nach für die Methode mit dem Salt verwenden? SHA-256?

Addition:

Ich habe mich gerade nochmal etwas genauer informiert und habe herausgefunden, dass password_hash scheinbar automatisch einen Zufalls-Salt hinzufügt. (http://www.html-seminar.de/html-css-php-forum/board40-themenbereiche/board18-php/4384-loginpasswort-richtig-hashen-password-hash-password-verify/#post30517) , siehe auch das Bild des geankerten Beitrages von TheScout. Das wollte ich mal erwähnen :-)

0
tDoni  23.08.2016, 17:51
@Elgatos

Wie bereits gesagt, habe ich mit der Funktion noch nie gearbeitet ;)

Vergiss jetzt aber vor lauter Salz nicht, deine DB auch gegen Injections abzusichern.

0
Elgatos 
Fragesteller
 24.08.2016, 18:57
@tDoni

Ok, danke für die Hilfe & Erklärung.

Den Hilfreichste-Antwort-Stern hast Du Dir verdient :-)

0

Passwörter sollten mit hashes gesichert werden. Mail addressen nicht. Hashing ist ein einmalverfahen. Also mail addresse verschüsseln. Aes256 sollte gut sein