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

...komplette Frage anzeigen

3 Antworten

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 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 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 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 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

Warum willst du die eMail hashen? Das ist totaler Schwachsinn... wie willst du dem Benutzer dann denn ne eMail schreiben?

Elgatos 22.08.2016, 18:09

Die E-Mail Adresse wird durch ein Skript anschließend wieder ausgelesen, beispielsweise ein Formular zum Anschreiben eines Nutzers.

0
triopasi 22.08.2016, 18:11
@Elgatos

Bei einem Hash wie md5 doer sha ist es aber nicht möglich da es eine Ein-Weg-Verschlüsselung ist...

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..

0
Copyyy 22.08.2016, 18:21
@triopasi

Es ist keine "Ein-Weg-Verschlüsselung", da es so etwas nicht gibt. Eine Verschlüsselung ist per definitionem etwas, was wieder entschlüsselt werden kann (mit dem richtigen Key). Und md5 sollte nicht mehr verwendet werden.

0
triopasi 22.08.2016, 18:23
@Copyyy

Ja md5 ist ein Hash aber das meint der Fragesteller hier ja ohnehin. Außerdem ist es egal welchen Algorithmus man verwendet (MD, SHA,RIPEMD, Whirlpoo, sonstwas), es ist hier einfach Schwachsinn.

0
Elgatos 22.08.2016, 18:24
@triopasi

Stimmt. Teilweise ist es aber möglich, über sogenannte "HASH-Decrypter" den Hash wieder auszulesen. Dies ist allerdings auch nur möglich, wenn das gehashte Wort sich in deren Datenbank befindet, um die "Lösung" auszugeben.

Aber nehmen wir mal Passwörter als Beispiel. Diese werden natürlich gesichert, damit auch Administratoren (mit Zugriff auf die Daten) die Passwörter nicht einsehen können und es allgemein sicherer ist. Da sind wir bestimmt einer Meinung, oder nicht?

Du bist der Meinung man solle E-Mail Adressen als Klartext speichern. Okay, wenn es keine direkte Verschlüsselung dafür gibt, dann wird das auch so gemacht. Aber meine Frage an dich: Kennst du denn eine Möglichkeit, E-Mail Adresen zu verschlüsseln und diese auch letztendlich auch wieder zu verwenden (ähnlich wie bei dem Password)?

0
triopasi 22.08.2016, 18:28
@Elgatos

Man kann jeden Hash theoretisch knacken... Unter Umständen dauert das aber halt mit nem heutigen PC ne Million Jahre ;)

Passworter werden gehasht, damit da keiner dran kommst, selbst wenn er vollen Zugriff auf Server hat (DB und Code).

Ja zB kann man in PHP recht einfach AES benutzen... Ist aber totaler Schwachsinn weil wenn der Hacker an deinen Code kommt hat er auch das Passwort zum entschlüsseln der eMails...Somit hast du ihm 5 Minuten mehr Arbeit gemacht... das ist dem Hacker dann auch sowas von egal.

0
Elgatos 22.08.2016, 18:31
@triopasi

Da hast du recht. Knacken kann man das alles, aber sicherer ist es immerhin trotzdem ein wenig :-)

Also Passwörter würdest auch du weiterhin verschlüsselt speichern und E-Mail Adressen deiner Meinung nach als Klartext, stimmts?

0
triopasi 22.08.2016, 18:34
@Elgatos

Passworter NIE im Klartext, NIE!! eMails schon.

0
Elgatos 22.08.2016, 18:36
@triopasi

Und wir beruhigen uns alle mal....

Ich sagte ja, "Passwörter weiterhin verschlüsselt..." :D

Okay dankeschön :-)

0
triopasi 22.08.2016, 18:37
@Elgatos

Man darf nicht mal daran denken, Passwörter im Klartext zu speichern! xD

0

Was möchtest Du wissen?