it-swarm.com.de

Verschlüsselung von E-Mail-Adressen in PHP

Ich erstelle eine Website und versuche herauszufinden, wie die E-Mail-Adressen des Benutzers verschlüsselt werden können. Es wäre schön, wenn die E-Mails meiner Benutzer im Falle eines Diebstahls meiner Datenbank nicht im Klartext wären. Ich dachte, der Benutzer benötigt die E-Mail, um sich offensichtlich anzumelden. Wenn ich sie also mit ihrem Passwort als Schlüssel oder sogar mit der E-Mail selbst verschlüssele, könnte ich trotzdem eine Anmeldefunktion erstellen, die funktionieren würde.

Das Problem tritt auf, wenn ich die E-Mail-Adresse des Benutzers benötige. Zum Beispiel in einer Situation, in der ein Passwort zurückgesetzt oder ein Newsletter verschickt wird. Ich könnte ein zweites Feld in der Datenbank mit der E-Mail-Adresse des Benutzers haben, das mit einem mir bekannten Schlüssel verschlüsselt ist.

Kann ich etwas verschlüsseln, bei dem zwei Schlüssel funktionieren? Wie ein Hauptschlüssel ... oder bin ich dumm?

10
Jason

Wenn Sie die E-Mail nur überprüfen müssen, wenn der Benutzer sie bereitstellt, müssen Sie sie wie vidarlo schlägt vor hashen, genauso wie Sie ein Passwort hashen würden. Hier ist keine Verschlüsselung erforderlich. Die Kehrseite dieses Ansatzes ist, dass Sie die E-Mail niemals wiederherstellen können, selbst wenn Sie sie wirklich benötigen (z. B. um Ihre Benutzer im Falle von Kompromissen zu kontaktieren, wie in den Kommentaren vorgeschlagen).

Wenn Sie die E-Mails abrufen müssen, verschlüsseln Sie sie einmal mit einem von Ihnen kontrollierten Schlüssel. Hier müssen Sie die E-Mail nicht zweimal für verschiedene Zwecke verschlüsseln - tun Sie es einfach einmal. Der schwierige Teil bei dieser Lösung ist wo der Schlüssel gespeichert werden soll .

17
Anders

Benötigen Sie wirklich die E-Mail-Adresse des Benutzers?

Wenn Sie die E-Mail-Adresse als Hash (E-Mail + Salt): Salt speichern, können Sie die vom Benutzer angegebene E-Mail-Adresse trivial überprüfen. Wenn der Benutzer ein Zurücksetzen des Kennworts anfordert, überprüfen Sie einfach, ob die E-Mail-Adresse übereinstimmt, und senden Sie die E-Mail an die vom Benutzer angegebene E-Mail.

Wenn Sie Suchvorgänge in der Datenbank basierend auf der E-Mail-Adresse zulassen möchten (Benutzername ist beispielsweise E-Mail), funktioniert dieses Modell offensichtlich nicht. Wie jedoch von Conor Mancone hervorgehoben, funktioniert ein globaler Pfeffer für alle Adressen, verringert jedoch die Sicherheit etwas.

Dies beseitigt natürlich die Möglichkeit für Sie, Newsletter zu versenden. Dies bedeutet jedoch, dass bei einem Datenbankverstoß die E-Mail-Adressen nicht angezeigt werden.

11
vidarlo

Eine Alternative zu vorhandenen Antworten: Legen Sie die E-Mails auf einem separaten Computer und einer separaten Anwendung ab und speichern Sie nur die Hashes in Ihrer Hauptanwendungsdatenbank.

Verwenden Sie den Hash zum Überprüfen der E-Mails.

Wenn Sie eine E-Mail senden müssen, kommuniziert Ihre Anwendung mit diesem anderen Dienst und leitet die Hash + E-Mail-Nachricht weiter. Die andere Anwendung sendet die E-Mail.

Natürlich könnte ein Hacker den sekundären Computer hacken und Zugriff auf die E-Mails erhalten, aber Sie fügen immer noch Sicherheit hinzu, weil:

  1. Die sekundäre Maschine muss nicht dem Internet ausgesetzt sein
  2. Der sekundäre Computer kann extrem minimal sein. Er muss lediglich eine sehr eingeschränkte API für Ihre Anwendung verfügbar machen und über einen Dienst zum Senden von E-Mails verfügen
  3. Es kann viel gesperrt werden, da es nur eine ganz bestimmte Sache tut

Die Angriffsfläche der sekundären Maschine kann also way kleiner sein als die Ihrer Anwendung.

Bonuspunkte: Sie können die anderen Antworten auf Ihren sekundären Computer anwenden und so die Sicherheit noch weiter erhöhen (obwohl dies niemals perfekt sein wird, wenn Sie davon ausgehen, dass Sie bereits gehackt sind ...)

6
Giacomo Alzetta

Für die Anmeldung muss die E-Mail-Adresse nachgeschlagen werden, die nicht skalierbar ist, wenn sie ordnungsgemäß gehasht wurde. Bei 10.000 Benutzern in Ihrem System müssen Sie die E-Mail-Adresse eines Benutzers aufgrund von Salzen durchschnittlich 5.000 Mal bei jeder Anmeldung hashen.

Darf ich Ihre Prämisse in Frage stellen?

"Ich dachte, der Benutzer benötigt die E-Mail, um sich offensichtlich anzumelden."

Warum geben Sie ihnen nicht stattdessen einen Benutzernamen (oder lassen Sie sie auswählen)? Dies wird dann nicht mit ihrer E-Mail verknüpft, es sei denn, sie wählen einen Benutzernamen, der sehr nahe an ihrer E-Mail liegt.

Natürlich benötigen Sie ihre E-Mail-Adresse weiterhin, wenn Sie ein Zurücksetzen des Kennworts durchführen. Sie können dies jedoch nicht anbieten, eine alternative Methode verwenden (z. B. einen bei der Anmeldung angegebenen OTP-Code) oder eine separate Datenbank mit Benutzernamen für E-Mails aufbewahren.

2
Daniel Williams