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

  • Certstream, InfluxDB, Grafana und Netflix

    16.04.2019

    Nachdem ich vor kurzem über mein erstes Spielen mit dem certstream berichtete, habe ich weitere Experimente gemacht und die Daten zur besseren Auswertung in eine InfluxDB gepackt, um sie mit Grafana untersuchen zu können.

    Weiterlesen...

Neueste Artikel

  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...
  • LinkCollections 2024 III

    Nach der letzten losen Zusammenstellung (für mich) interessanter Links aus den Tiefen des Internet von 2024 folgt hier gleich die nächste:

    Weiterlesen...
  • Funktionen mit mehreren Rückgabewerten in Java

    Da ich seit nunmehr einem Jahr bei meinem neeun Arbeitgeber beschäftigt und damit seit ungefähr derselben Zeit für Geld mit Python arbeite, haben sich gewisse Antipathien gegenüber Python vertieft (ich kann mit typlosen Sprachen einfach nicht umgehen) - aber auch einige meiner Gründe, Python zu lieben sind ebenso stärker geworden. Einer davon ist der Fakt, dass eine Methode in Python mehr als einen Wert zurückgeben kann.

    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.