Da ich mich seit einiger Zeit mit 2-Faktor-Authentifizierung befasse, habe ich mich von der praktischen Nutzung vor einigen Tagen nochmals zurückbesonnen auf die Theorie dahinter: Das Verfahren, das beispielsweise hinter Googles Authenticator steckt, ist in einer RFC beschrieben.
Nach einer Google-Recherche stieß ich auf die im Titel genannte RFC 6238, die eine Beispielimplementierung des Time-based One-Time Password-Algorithm enthält. Diese ist bereits in Java gehalten. Nach einem Trockentest, bei dem ich in einem Java-Programm das Token erzeugte und mit einem durch die offizielle Google-Authenticator-App erzeugten verglich, konnte es ans Eingemachte gehen:
Die Java Advanced Authentication Software JAAS ist ein System zur Authentifizierung und Autorisierung in Java-Anwendungen. Die Architektur ist modular aufgebaut, so dass die Mittel zur Authentifizierung deklarativ beim Programmstart spezifiziert werden und demzufolge auch unkompliziert ausgetauscht werden können (LoginModule).
Die Autorisierung erfolgt über Principals, die nach erfolgter Authentifizierung zugeordnet werden. In einer Anwendung, die dieses Framework nutzen möchte, muss ein CallbackHandler registriert werden, der die verschiedenen Anforderungen des jeweiligen LoginModules erfüllen kann: Ein einfaches Login-Modul könnte zum Beispiel einen Usernamen und ein Passwort gegen eine Datenbank prüfen. Dann benötigt es natürlich einen Nutzernamen und ein Passwort. Dafür sind im Framework verschiedene Callbacks definiert: unter anderem für UserName, Password und beliebige Texteingaben.
Da ich mit dWb+ bereits eine Anwendung pflege, die die unterschiedlichen Rechte mittels JAAS verwaltet, lag die Idee nahe, RFC 6238 hiermit zu testen: Der CallbackHandler, der hier zum Einsatz kommt, zeigteinen Dialog mit einem Texteingabefeld und einem Passworteingabefeld an und setzt die dort eingetragenen Werte in die entsprechenden Callbacks ein. Ich fügte einen weiteren Callback zum LoginModule und zum CallbackHandler hinzu, der das jeweilige One Time Password transportiert. Den Login-Dialog änderte ich nicht. Statt dessen traf ich eine Festlegung wie folgt: Das Token wird an den Nutzernamen angehängt. Da das Token immer sechs Zeichen lang ist, kann ich die letzten sechs Zeichen des Nutzernamens einfach abschneiden und diese an den Callback für das Token weitergeben. Was dann übrig bleibt, wird wie vorher an den UserName-Callback weitergereicht.
Nach dieser Umstellung der Authentifizierung konnte ich erfolgreich entsprechende Tests durchführen: Die Anmeldung an der Anwendung funktionierte nun nur noch mit dem korrekten One Time Password: Ein Versuch ohne OTP schlägt genauso fehl wie ein Versuch ohne Angabe eines OTP.
Damit ist die prinzipielle Funktionsweise nachgewiesen - allerdings verbietet sich eine solche Implementierung im Produktivbetrieb natürlich, weil das gemeinsame Secret zu Testzwecken fest im Quelltext verankert wurde - in Produktivsystemen muss spezielle Sorge dafür getragen werden, das Secret so abzulegen, dass kein Unberechtigter es auslesen kann!
11.06.2021
Ich berichtete neulich über die Installation und erste Tests von Keycloak. Nun bin ich tiefer eingetaucht und habe die diversen Möglichkeiten untersucht, die Authentifizierung mittels zweiten Faktors sicherer zu machen.
Multi-User-WebDAV, Docker, GitHub
17.11.2019
Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.
Weiterlesen...Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.
Weiterlesen...Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.