Im Internet sind oft Hacker unterwegs, welche Sicherheitslücken in Webanwendungen suchen. Hacker haben nicht nur immer die Intention, Aufmerksamkeit zuerregen und somit die Webanwendung zu abzuschalten, sondern sammeln auch gerne Benutzerdaten von Communities, um evtl. mit diesen Zugangsdaten sich in anderen Webseiten anmelden zu können. Verwenden Anwender überall die gleichen Zugangsdaten, können Hacker mit geklauten Zugangsdaten recht einfach bei Ebay oder Amazon für Umsonst einkaufen. Auch Mitarbeiter der Community mit Leseberechtigung auf der Datenbank können die Daten auslesen.

Als Webmaster können Sie diese Sicherheitslücke reduzieren, indem Zugangsdaten in Ihrem Projekt komplett verschlüsselt werden.

Zugangsdaten verschlüsseln

In meinem Beispiel hat eine Community als Zugangsdaten pro Anwender E-Mail Adresse und Passwort gespeichert. Gelingt einem Hacker der Zugang zur Datenbank, kann dieser mit den Zugangsdaten schon Schaden anrichten. Im Normalfall ist jedoch das Passwort verschlüsselt. Ein Schritt weiter geht mein Prinzip, auch den Benutzerloginnamen, sprich hier die E-Mail Adresse zu verschlüsseln. Und zwar so sicher wie das Passwort. Dadurch stehen in der Datenbank in der User-Tabelle nur zwei Spalten mit gehashten Werten. Somit ist nach einem Datenklau auch nicht die E-Mail Adresse der Anwender bekannt.

Beispielprogramm

Im Grunde müssen Sie statt nur dem Passwort auch die E-Mail Adresse mit verschlüsseln. Dies sieht im Quellcode beispielhaft wie folgt aus:

token = new MailPasswordToken(email, password);

    ...

    public AuthenticationInfo doLogin(MailPasswordToken token)
    {
        return userService.getLoginMatch(Sha256Hash(token.getEmail), Sha256Hash(token.getPassword));    
    }

Natürlich müssen Sie auch das Anlegen des Benutzers in der Datenbank anpassen:

    public void createLogin(MailPasswordToken token)
    {
        userService.create(Sha256Hash(token.getEmail), Sha256Hash(token.getPassword));
    }

Vorteile und Nachteile

Vorteil ist hier die höhere Sicherheit, die Sie dem Anwender geben können, dass seine Zugangsdaten zu 100% unleserlich in der Datenbank gespeichert werden. Jedoch hat dies für Sie als Webmaster den Nachteil, dass Sie dem Anwender keine E-Mails mehr senden können, da die E-Mail Adresse nicht mehr lesbar ist. E-Mails können nur noch versendet werden, wenn der n beim Login seine E-Mail Adresse in der Session gespeichert bekommt und selbst Aktionen ausführt, welche E-Mails versenden. Auch das Zusenden eines neu generierten Passworts wäre noch möglich:

    public void resetPassword(String email)
    {
        String newPassword = userService.resetPassword(Sha256Hash(email));
        sendPasswordMail(email, newPassword);
    }

Natürlich ist es kein Muss, sich mit dieser Sicherheit im Mailversand einzuschränken. Im Regelfall sollten Sicherheitsmaßnahmen getroffen werden, welche ein Auslesen der Zugangsdaten aus der Datenbank im Vorfeld verhindern sollten.

E-Mail Adresse verschlüsseln
Markiert in:            

3 thoughts on “E-Mail Adresse verschlüsseln

  • 27. Februar 2013 bei 21:15
    Permalink

    Hallo Christian, vielen Dank für diesen Tipp. Als Neuling bin ich danbar für jeden Tipp – da ich sehr viele Spammails bekomme weil meine Mailadresse sichtbar ist.

    Antwort
  • 28. Februar 2013 bei 00:01
    Permalink

    Interessanter Ansatz. Allerdings wird das dann wie beschrieben schwer die Mitglieder zu erreichen. Bei einem Shop z.B müsste der Kunde jedes mal seine Email neu eingeben oder diese zumindest während der Sitzung gespeichert werden…

    Antwort
    • 13. März 2013 bei 16:20
      Permalink

      Das Logintoken sollte dann die E-Mail unverschlüsselt speichern. Aber das ist ja auch in dem Beispiel dann selbstverständlich.
      Und es gibt dann nur Mails, wenn der Kunde am System angemeldet ist.

      Antwort

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>