Passwort Sicherheit Teil 3

Manuel Badzong    05.01.2014

Passwort Sicherheit Teil 3

Im letzten Teil der Serie zum Thema Passwort Sicherheit geht es darum, wie man als Software Entwickler Passwörter speichern sollte, damit sich eine Drittperson nicht so einfach Zugriff auf die Passwörter und das System verschaffen kann.

Zudem sollte man bedenken, dass viele Benutzer das gleiche Passwort mehrfach verwenden. Speichert man also Emailadressen und Passwörter seiner Benutzer, übernimmt man als Entwickler eine grosse Verantwortung.

Dieser Artikel beschreibt, wie man heute Passwörter auf eine möglichst sichere Art und Weise speichert.

History

Immer wieder kommt es auch bei grossen Internet Plattformen vor, dass sich Hacker unbefugt Zugriff auf Benutzerdatenbanken verschaffen können. Abhängig von der Art und Weise, wie die Passwörter in diesen Datenbanken gespeichert werden, haben die Angreifer danach Zugriff auf eine grosse Anzahl der Benutzer Informationen und die dazugehörigen Passwörter im Klartext.

Hier einige Beispiele:

Problemstellung

Oft benötigt man bei Applikationen, insbesondere bei Webapplikationen eine Benutzerauthentifizierung. Authentifizierte Benutzer erhalten üblicherweise eine Profilseite und zusätzliche Funktionen in der Webapplikation.

Verwendet man bei der Entwicklung kein Framework, welches bereits Authentifizierung anbietet, kann es vorkommen, dass man dies selbst ausprogrammieren muss.

Am besten verwendet man ein bestehendes Verfahren oder System zum Speichern von Passwörtern und für die Authentifizierung.

Notwendige Daten

Für das Login muss für jeden Benutzer mindestens der Benutername oder die Emailadresse gespeichert werden und im Klartext verfügbar sein. Das Passwort wird nur zur Authentifizierung benötigt.

Passwörter werden zur Authentifizierung nicht im Klartext benötigt und dürfen deshalb auch nicht im Klartext gespeichert werden.

Passwörter im Klartext

Am Einfachsten wäre es, das Passwort im Klartext abzuspeichern. Will sich ein Benutzer authentifizieren, wird einfach das eingegebene Passwort mit dem gespeicherten Passwort verglichen. Stimmen beide überein, wird dem Benutzer Zugriff gewährt und eine neue Session erstellt.

Obwohl höchstgradig unsicher, wird diese Methode immer noch von vielen Programmen verwendet. Man erkennt dies beispielsweise daran, dass wenn man sein Passwort vergisst, die Webapplikation in der Lage ist einem das eigene Passwort per Email zu senden.

Bekommt man eine Kopie des eigenen Passwortes per Email, wenn man es vergessen hat, hat die Applikation Zugriff auf das Klartext Passwort. Bei einer solchen Applikation sollte man auf keinen Fall ein Standard Passwort verwenden.

Kann sich ein Angreifer Zugriff auf die Datenbank verschaffen, ist er im Besitz aller Passwörter. Zudem haben die zuständigen Administratoren direkten Zugriff auf alle Passwörter. Man beachte, dass die meisten Angriffe auf Computersysteme von innen, also von Mitarbeitern getätigt werden.

Verschlüsselung

Auf den ersten Blick scheint es naheliegend, dass man die Benutzerpasswörter verschlüsst speichern sollte. Das heisst man verwendet einen Verschlüsselungsalgorithmus (AES, Twofish, etc.) und einen Masterschlüssel und legt das Passwort als Ciphertext ab. Meldet sich ein Benutzer beim System an, wird das eingegebene Passwort mit dem Masterkey verschlüsselt und mit dem Gespeicherten verglichen.

Da das Programm zur Laufzeit die Passwörter verschlüsseln muss, liegt das Hauptproblem jetzt beim Speichern des Masterkeys. Kann sich ein Angreifer Zugriff auf die Benutzerdatenbank verschaffen, ist es naheliegend, dass er auch Zugriff auf den Masterkey erlangen kann. Folglich hat er wieder Zugriff auf alle Passwörter im Klartext.

Des Weiteren muss man beachten, dass für zwei Benutzer mit dem gleichen Passwort der gleiche Ciphertext gespeichert wird. Was die Passwort Analyse einfacher macht und im Zusammenhang mit Sicherheitsfragen ein grosses Risiko darstellt. Dieses Problem löst man mit Salz. Mehr dazu folgt weiter unten.

Wird zur Verschlüsselung der Passwörter ein asymmetrischer Algorithmus verwendet (z.B. RSA) und der Schlüssel zum Entschlüsslen weggeworfen, ist dies vergleichbar mit Hashing.

Passwort Hashing

Hashing ist ein Verfahren bei welchem Daten ein eindeutiger Schlüsselwert zugewiesen wird. Für die gleichen Daten wird immer der gleiche Schlüsselwert erzeugt.

Ein ganz einfaches Beispiel für einen solchen Algorithmus ist die Modulo Operation. Für jede natürliche Zahl kann z.B. Modulo 13 gerechnet werden. Jede Zahl erzeugt bei erneuter Berechnung immer den gleichen Wert. Vom Modulo Wert ist es aber unmöglich auf die ursprüngliche Zahl zurück zu schliessen, da z.B. die Zahlen 15, 28 und 41 alle den Modulowert 2 erzeugen.

Klartext  = Foobar7

MD5       = f4ae9e9014786faaee30412ec705863d

SHA1      = 0bbe9284d18ba5a8ba448891af8f78b32ed7810e

SHA-256   = 9e0a109afbf26605365b01ba36f23fd7b4f19f51806bc9daaa16e48205c16ff1

Whirlpool = 5515144ef35607ae2e9872092b28160db992d126631027a2f598773e174fa5cf
            f2f925ea6ccd7e1f5b997b0eb27f4e32b756d621c60cbf8cf1e4d50da51e5c32

Da man nach dem Hashing keinen Zugriff mehr auf das Klartext Passwort hat, werden Benutzer Passwörter geprüft, indem man das eingegebene Passwort erneut hasht und mit dem gespeicherten Hashwert vergleicht.

Hashing löst das Problem nur teilweise. Haben zwei Benutzer das gleiche Passwort wird der gleiche Hashwert erzeugt. Dies kann ein grosser Vorteil beim Password Guessing darstellen. Zudem kann man die Hashwerte im Voraus berechnen und in einer Datenbank speichern. Somit können die Klartextpasswörter einfach in einer Hash Datenbank nachgeschlagen werden.

Hashing alleine genügt nicht, um Passwörter sicher zu speichern.

Salts

Das Ziel von Salts ist es, für jedes Passwort mehrere gültige Hashwerte zu zulassen. So dass mehrere Benutzer mit dem gleichen Passwort nicht oder nur höchst unwahrscheinlich (nie) den gleichen Hashwert erzeugen. Will man die gesalzenen Passwörter in einer Datenbank speichern, muss man dies für jede gesalzene Variante machen, wodurch der Speicherplatz für eine umfassende Passwort Datenbank gigantisch wäre.

Zum Beispiel verwendet der Benutzer Bob das Passwort Foobar7. Beim ersten Speichern des Passworts wird dann ein zufälliges Salt erstellt fZ5cK/9OeR-s, welches zusammen mit dem Passwort gehasht wird. In der Datenbank speichert man anschliessend den Benutzernamen, das Salt im Klartext und den erzeugten Hashwert. Will sich der Benutzer mit dem Passwort authentifizieren, wird zuerst das Salt aus der Datenbank geladen, mit dem eingegeben Passwort gehasht und anschliessend mit dem gespeicherten Hashwert verglichen.

Das Problem bei dieser Methode liegt darin, dass das Salt für das Hashing im Klartext verfügbar sein muss und damit eine Brute Force Attacke erleichtert.

Ist das Salt im Klartext verfügbar wird, eine Brute Force Attacke massgeblich vereinfacht.

Moderne Verfahren

Moderne Verfahren zum Speichern von Passwörtern wie zum Beispiel Bcrypt oder PBKDF2 verwenden eine Kombination aus den genannten Verfahren.

Von dem eingegebenen Passwort wird ein eindeutiger Schlüssel abgeleitet. Dieser Schlüssel ist vergleichbar mit einem Hashwert. Dieser Schlüssel wird dazu verwendet um das zufällig erzeugte Salt und den Hashwert oder den Ciphertext aus Salt und Passwort zu verschlüsseln. Dieses Resultat wird anschliessend im System gespeichert. So hat ein Angreifer weder Zugriff auf das Passwort noch auf das verwendete Salt.

Um das Passwort zu prüfen, wird von einem eingegebenen Passwort der Schlüssel abgeleitet, das Salt entschlüsselt mit dem Passwort zusammen verschlüsselt oder gehasht und mit dem entschlüsselten Hash aus dem System verglichen.

Zusätzlich wird eine bestimmte Anzahl Iterationen festgelegt, mit welcher der Schlüssel vom Klartext Passwort abgeleitet werden muss. Ein üblicher Wert heutzutage ist 1024 Iterationen. Dies erhöht den Rechenaufwand enorm und kann in der Zukunft der verfügbaren Rechenleistung angepasst werden.

Ablauf Authentifizierung

  1. Aus dem eingegebenen Password wird ein Schlüssel abgeleitet. Um den Rechenaufwand zu erhöhen, kann die Anzahl Iterationen dynamisch festgelegt werden.

  2. Mit dem erzeugten Schlüssel wird das Salt und der Ciphertext entschlüsselt.

  3. Mit dem Salt und dem Schlüssel wird erneut der Ciphertext berechnet.

  4. Der Ciphertext wird mit dem Gespeicherten verglichen. Stimmen sie überein ist die Authentifizierung erfolgreich.

Schlussfolgerungen

Beim Speichern von Passwörtern sollte man wenn möglich immer auf bestehende Verfahren zurückgreiffen. Man sollte sich zudem bewusst sein, dass übliche Verfahren schnell veraltet sein können und abgelöst werden müssen.


Recent Posts

NGINX Rate Limits für Wordpress Pingbacks

23.04.16 | Manuel Badzong

iPad Safari Scareware entfernen

20.03.16 | Manuel Badzong

DDoS Abwehr Teil 2

02.03.16 | Manuel Badzong

Wie schützt man sich vor Ransomware

19.02.16 | Manuel Badzong

DDoS Abwehr Teil 1

08.12.15 | Manuel Badzong

Passwort Sicherheit Teil 3

05.01.14 | Manuel Badzong

Passwort Sicherheit Teil 2

04.01.14 | Manuel Badzong

Passwort Sicherheit Teil 1

03.01.14 | Manuel Badzong