A08 PBKDF2-Verfahren

Die Nutzung des PBKDF2-Verfahrens wird Euch bei der ersten Betrachtung als unsinnig erscheinen, später jedoch eine sehr sinnvolle Ergänzung Eurer Programm in der realen Welt sein.

Was macht dieses Verfahren mit einem Passwort ? Fangen wir einen Schritt vorher an – üblicherweise nutzt Ihr eine graphische Oberfläche (GUI) für Euer Programm und dort wird üblicherweise auch ein Passwort-Eingabe-Feld bereitgestellt, welches statt der Klartextanzeige nur Sternchen im Feld  anzeigt. Das Element stellt das eingegebene Passwort in einem Char Array zur Verfügung und an dieser Stelle fängt unsere PBKDF2-Routine an.

Zuerst wird ein Zufalls-Salt-Wert erzeugt, welcher dafür sorgt, das der später als Passwort dienende  Wert stets unterschiedlich ist und die vorbereitete Passwort-Tabelle (sogenannte „Rainbow-Tables„) nicht nutzbar sind.

Das  Passwort wird nun mit dem angegebenen Hashverfahren (hier „PBKDF2WithHmacSHA512“) immer wieder gehasht, und zwar mit der angegebenen Anzahl der Iterationen.

Am Ende steht im Byte Array „passwordHashByte“ das neue Passwort bereit, welches z.B. für eine AES-Verschlüsselung genutzt wird.

Warum sollte ich PBKDF2 nutzen und nicht nur ein einfaches Hash-Verfahren ? Hier kommen wir nun zum entscheidenden Punkt, welcher als Stichpunkt die Entropie hat. Ich werde Euch nicht mit der ausführlichen Erläuterung langweilen sondern gebe Euch die Kurzversion – Entropie bezeichnet die Unterschiedlichkeit. Wenn Ihr z.B. über die Tastatur ein Passwort aus dem vorhandenen 26-Buchstaben und 10-Ziffern Umfang der Tastatur nutzt kommt Ihr auf (26 * 2 [Großbuchstaben] +10) = 62 unterschiedliche Zeichen, wobei jedoch jedes Zeichen im Char-Array aus 256 (unterschiedlichen) Zeichen bestehen kann. Im Klartext bedeutet es für einen Angreifer eine wesentliche Verkleinerung des genutzten Zeichenvorrates und damit eine krasse Verkürzung einer Brute Force Attacke, bei der ein Angreifer alle möglichen Zeichen hintereinander ausprobiert.

Der zweite wichtige Aspekt ist die Geschwindigkeit – eine Hashroutine ist üblicherweise auf eine hohe Geschwindigkeit ausgelegt und auch das spielt einem Brute Force-Angreifer in die Hände. Die beschriebene PBKDF2-Routine verlangsamt das Programm bei Eingabe des Passwortes und verlängert damit die Zeit, in der ein Angreifer alle möglichen Kombinationen ausprobiert. Die Anzahl der Iterationen ist hier der entscheidende Stellfaktor – desto höher desto mehr Iterationen werden ausgeführt und damit dieser Programmteil verlangsamt.

Ein Punkt benötigt aber Eure Aufmerksamkeit: der erzeugte Salt ist zusammen mit dem erzeugten (gehashten) Passwort abzuspeichern oder weiterzugeben, ansonsten klappt es nicht mit der Nutzung beim Empfänger (also der Entschlüsselung).

Kurzum: Ihr solltet die PBKDF2-Routine bei jeder Passwort-basierten Verschlüsselung nutzen !

Kommen wir nun zur Routine:

Die Ausgabe auf der Konsole findet Ihr nachfolgend (bitte beachtet das Eure Ausgabe wegen der Zufallsroutine andere Werte anzeigt):

Den Quellcode zum Programm findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/A-Allgemeine-Programme. Dort findet Ihr auch die Versionen für Java 11.

Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.

Letzte Aktualisierung: 26.01.2019