RFC 6238 und JAAS

vorhergehende Artikel in: Java Komponenten Rants
05.08.2017

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!

Artikel, die hierher verlinken

Keycloak, OTP, FIDO

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.

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Fährnisse des Buildprozesses unter Windows

    17.07.2019

    Nachdem ich begonnen hatte, mich mit der Beschleunigung der Berechnung des Mandelbrot-Fraktals unter Zuhilfenahme der Shadereinheiten in Graphikkarten zu beschäftigen und erste Erfolge feiern konnte, wollte ich das mal auf einer richtigen Graphikkarte ausprobieren...

    Weiterlesen...

Neueste Artikel

  • Datenvalidierung UTF8 mit BiDi-Steuerzeichen (TrojanSource 2.0)

    Ich bin heute nochmal inspiriert worden, weiter über die Trojan Source Vulnerability nachzudenken. Meiner Meinung nach bestehen hier noch Probleme - speziell bei Nutzereingaben oder Daten, die über externe Schnittstellen ampfangen werden.

    Weiterlesen...
  • OpenStreetMap Navi als Docker-Container

    Ich habe die auf OpenStreetMap basierende OpenSource Navigationslösung Graphhopper in einen Docker-Container gepackt und als neuestes Mitglied in meinem Docker-Zoo willkommen geheißen.

    Weiterlesen...
  • SQL-Aggregatfunktionen in SQLite als BeanShell-Scripts

    Ich habe neulich über eine Möglichkeit berichtet, SQLite mittels der sQLshell und Beanshell-Skripten um SQL-Funktionen zu erweitern. In diesem Artikel versprach ich auch, über eine solche Möglichkeit für Aggregatfunktionen zu berichten.

    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, muß 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 GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.