QR-Code zweiten Faktor ohne Handy: einfache Lösung?

pit234a

Well-Known Member
Am besten bleibe ich so konkret, wie eben möglich, denn ich habe in den letzten Stunden viel zu diesem Thema gelesen und zumindest erfahren, dass es nicht ganz so einfach ist, wie ich zunächst dachte.

Leider bin ich nun bei einem Service-Anbieter gelandet, wo ich offenbar nicht weiter komme, weil die Vorgaben streng so ausgelegt sind:
Ich will meinen Datensatz mittels Browser pflegen/ändern
  • eine Bestätigungsmail geht mir zu, ich muss einen Link drücken
  • ein Fenster poppt auf und zeigt einen QR-Code und ein Eingabefeld für Ziffern.
  • den QR-Code muss ich mit einem SmartPhone scannen und in einer 2FA-App dekodieren lassen
  • die dekodierten Ziffern muss ich dann im Browser eintippen

Was ich will, ist also eigentlich sehr einfach:
  • den QR-Code am PC einlesen
  • den enthaltenen "secret" am PC dekodieren und die Ziffern auslesen, die ich im nächsten Schritt brauche

Den QR-Code am PC einlesen kann ich schon mal und den enthaltenen Code auch sehen. In dem Fall ist das einfach ein sha1-hash der Ziffern und des Datums (wie ich gelesen habe).
Die Methode muss ziemlich autark funktionieren, also die verschlüsselte Information muss wohl alles enthalten, was man zum Entschlüsseln braucht, denn ein Handshake zwischen Aussteller und vorgesehener App auf dem Smartphone findet da offenbar nicht weiter statt (wobei ich mir nicht 100% sicher bin, sondern aus den Beschreibungen eher vermute, dass es so sein wird).

Nun habe ich also einen Code (leicht verändert):
Code:
secret=D6W5TS22HF2SGHDSAXNIIEAECG2KYDZP&issuer=absender.de&algorithm=SHA1&digits=6&period=30
digits=6 past zu den sechs Ziffern, die in ihren Eingabefeldern erwartet werden
period=30 wird wohl etwas zum Verfallsdatum sagen
bleibt nur noch der kleine Rest.

Was ich finde, sieht mir immer viel zu kompliziert aus.
zB kann offenbar keepassxc das Problem lösen, aber dazu muss es erst konfiguriert sein, also gerade so, als wolle ich es wirklich komplett als PW-Manager benutzen, nur um diesen kleinen Gefallen zu bekommen. Zumindest finde ich nicht raus, wie ich das machen kann, einen kleinen Befehl an die keepassxc-cli zu senden und einfach sechs Ziffern als Antwort zu bekommen. Gleich, oder ähnlich sieht es mit pass oder gopass aus.

Bevor ich mir jetzt eine prepaid-Karte kaufe und vielleicht ein Handy vom Schrott, um diese seltenen Schritte dann einmalig oder wenige Male im Jahr durchführen zu können, könnte es vielleicht einfacher sein, diesen sha1-hash irgendwie zu dekodieren.
 
Natürlich zuerst die Warnung: 2FA auf den PC machen zerstört natürlich den Sinn dahinter. Aber du bist groß und wirst schon wissen was du tust :)

Unter Linux nutze ich OTPClient - https://github.com/paolostivanin/OTPClient
In wie weit das unter FreeBSD läuft weiß ich nicht, aber du kannst ja mal probieren, ob es kompiliert.
 
Ohne das jetzt mit diesen Daten nachgeprüft zu haben, aber keepassxc kann TOTP auch. Nutze das selber, sowohl unter Windows, OpenBSD und FreeBSD, weil ich keine Authenticator App auf dem Handy für den Quatsch nutzen will.

Du musst dazu in keepassxc einen Eintrag erzeugen und dann in der Übersicht der Einträge via Kontextmenü “setup totp” auswählen. Danach kannst du mit Ctrl-t den aktuellen Code in die Zwischenablage kopieren.

Bei keepassxc kannst du ja beliebig viele Passwort Files anlegen, aber ohne wird es nicht gehen.
 
keepassxc kann TOTP auch.
damit habe ich es jetzt mal versucht. In einer VM hatte ich es mal installiert und nie benutzt, was mir nun zur Hilfe kam, ohne gleich (mitten in einer wichtigen Arbeit) mein System komplett upzudaten, um die aktuelle GUI-Version unterstützt zu sehen.

das waren so die beiden informativsten Seiten, die ich dazu konsultiert habe.
Mit keinem Tool habe ich es hinbekommen, die benötigte Ziffernfolge auf der Kommandozeile zu sehen. Wahrscheinlich habe ich wirklich nicht verstanden, wie das Geraffel funktioniert.
Mit keepassxc hat es in der VM und mit GUI funktioniert, allerdings mit geringeren Abweichungen zur oben verlinkten Beschreibung. Fast alles ist dabei selbsterklärend, nur die Eingabe des "Geheimen Schlüssels" brauchte etwas Versuch und Irrtum, weil so sehr abweichend von der Beschreibung (die ich vielleicht auch nur wieder falsch verstanden habe). Der geheime Schlüssel ist der "Secret Teil" im QR-Code, also genau nur der SHA1-Hash. Praktischerweise steht der auch in Klartext unter dem QR-Code, der von meinem Anbieter angezeigt wird und kann von dort kopiert werden, ohne noch den QR anfassen zu müssen. Diesen Code ins keepassxc geworfen, lässt den einen Moment erstarren und anschließend kann man mittels Maustasten den TOTP anzeigen (oder kopieren).
Zeigt man ihn an, ändert er sich regelmäßig.
Das ist etwas, das ich nicht so verstanden habe. Woher bekommt der die neuen Nummern? Allerdings war mir das auch nicht wichtig genug, mal ein tcpdump nebenher an zu werfen.
Als ich nach einiger Zeit wieder nach einer Nummer gefragt wurde, stimmte die gerade angezeigte allerdings nicht, erst nach erneuter Bestätigung des gleichen Keys und kurzem Erstarren der Anwendung konnte ich wieder eine passende Ziffernfolge erhalten.
Das kann sowohl Zufall gewesen sein, als auch auf fehlerhafter Anwendung beruhen, denn das Tool bietet viele Möglichkeiten, etwas falsch einzustellen und ich benutzte halt nun die Vorgaben.
 
Der Anbieter liefert dir Secret + Metadaten (Hash (sha1 in dienem Fall), Codierung ( 6 Nummern in deinem Fall) ).

Du machst lokal nichts anderes als die Zeit mit deinem Secret zu verschlüsseln (viel Handwaving, es ist keyed hmac oder so) und dann daraus deine Nummer zu generieren (gibt auch welche mit 8, dann eher sha256 oder sha512).
 
Der Anbieter liefert dir Secret + Metadaten (Hash (sha1 in dienem Fall), Codierung ( 6 Nummern in deinem Fall) ).

Du machst lokal nichts anderes als die Zeit mit deinem Secret zu verschlüsseln (viel Handwaving, es ist keyed hmac oder so) und dann daraus deine Nummer zu generieren (gibt auch welche mit 8, dann eher sha256 oder sha512).
das verstehe ich nicht.
Ich will ja nur den Secret des Anbieters entschlüsseln und eine passende Ziffernfolge daraus erhalten.
Ich selbst will ja keinen Faktor generieren.

Scheinbar brauche ich mal wieder etwas länger....
 
Nachtrag : (sry bin am handy) : du hast quasi nie eine challenge vom Dienst. Der gibt dir einmal das secret und das mit wars
 
Also... Nochmal kurz zum verstehen...
QR Code ist fuer mich im Prinzip nix anderes als 2D codierte/gerenderte Payload. (Mit Redundanz)

In deiner Email hast du einmal das QR Bild UND die Payload?
Was genau machst du mit dem Handy? Laesst du da eine App drauf laufen, die die Payload durch einen Parser schickt?


Ist das eine Standardapp oder eine mit SecurityByObscurity(tm) ?

Ist ein Android-Emulator eine Option?

Warum ueberhaupt "Prepaid"? Handys funktionieren auch ohne Simkarte.
 
Also... Nochmal kurz zum verstehen...
QR Code ist fuer mich im Prinzip nix anderes als 2D codierte/gerenderte Payload. (Mit Redundanz)

In deiner Email hast du einmal das QR Bild UND die Payload?
Was genau machst du mit dem Handy? Laesst du da eine App drauf laufen, die die Payload durch einen Parser schickt?
ausgerechnet ich antworte, ist schon schräg.
Der QR-code ist nichts anderes, als ein Bild mit Daten, Dargestellt als Punkt auf einer Fläche. Es gibt verschiedene Modelle, wie so ein QR-Code allgemein-verständlich gebaut werden kann, aber auch individuelle Lösungen, wie etwa jener QR-Code auf einem sogenannten Medikamentenplan in DE. Individuelle Lösungen bedeutet natürlich auch, dass so etwas unter Umständen nur von wenigen Leuten verstanden werden kann.

In diesem Fall der von mir geschilderten 2FA-Lösung wird ein ganz normaler, gewöhnlicher QR-Code gesendet. Ihn zu lesen ist also kein Geheimnis.
In diesem QR-Code steckt ein geheimer Code, ein String, der eine Information über Datum und noch einige weitere Details enthält. Aus diesem String kann man als Mensch nicht ablesen, wie der zweite Faktor aussieht.
Hier kommt das Handy ins spiel: es kann den QR-code einlesen und an eine App übergeben, die ganz üblich und nicht Anwender-spezifisch ist. Es gibt bei google sogar mehrere Möglichkeiten (habe ich gelesen). Die App liest nun aus dem String die benötigte Ziffernfolge (oder generiert die nach Vorschrift), die dann meinen zweiten Faktor darstellt.
Ich übersetze das mal mit meinen Worten:
An meinen PC bearbeite ich eine Seite mittels Browser: erster Faktor
Erst kommt Mail an mich, mit einem Bestätigungslink: erste Hürde
Nach aktivieren des Links, wird mir ein QR-Code im Browser eingeblendet und im gleichen Fenster eine Ziffernfolge abgefragt: zweite Hürde
QR-Code wird von Handy in App gescannt und daraus die benötigte Ziffernfolge gebaut: zweiter Faktor
Ziffernfolge muss nun vom Handy abgelesen und richtig innerhalb einer bestimmten Zeit im Browser eingetippt werden: letzte Hürde
Damit habe ich mich nun im Browser authentifiziert und darf die Bearbeitung der empfindlichen Seite fortführen. Also nicht nur, dass ich eine Mail bestätigen konnte, die an mich geschickt war, sondern über einen anderen Weg habe ich nun auch noch eine Kontrollziffer eingetippt.

Das Verfahren erinnert ein wenig an die TAN-Generatoren der Bank. Da wird mir auch ein Maschinenlesbarer Code auf dem Bildschirm angezeigt, den ich mit einer HW lese, die zusammen mit einer eingelegten ID-Kart daraus eine Ziffernfolge generiert, meinen zweiten Faktor.

Nun habe ich kein Handy mit Apps und will mir auch keines kaufen und mich auch nicht bei google anmelden müssen.
Deshalb habe ich nach einer Alternative gefragt.
 
Nein du siehst das immer noch falsch. Der QR Code gibt der das Secret. Die Darstellungsform QR Code hat sich für die meisten Menschen als praktisch erwiesen, aber du könntest das auch als base64 angezeigt bekommen oder hex oder binär.

Du speicherst dein Secret EINMAL in deinem TOTP Generator. Danach spuckt dir dieser alle 30 Sekunden eine Zahlenfolge aus, mit der du dich authentzifzieren kannst. Der braucht dazu nichts weiteres. Praktisch zeigt er dir die Zahlen natürlich nur an (bzw. berechnet sie auch nur) wenn du hinsiehst.
 
... Der QR Code gibt der das Secret. ...

Du speicherst dein Secret EINMAL in deinem TOTP Generator. Danach spuckt dir dieser alle 30 Sekunden eine Zahlenfolge aus, mit der du dich authentzifzieren kannst. Der braucht dazu nichts weiteres. Praktisch zeigt er dir die Zahlen natürlich nur an (bzw. berechnet sie auch nur) wenn du hinsiehst.
so hatte ich es tatsächlich verstanden und wenn ich es falsch dargestellt habe, danke ich für die Klarstellung.

Vielleicht nur mit wenigen Anmerkungen: die angezeigten Zahlen (das Ergebnis der Secret-Auswertung durch eine SW), ändern sich laufend. Dazu wird ein Intervall vorgegeben, das im QR-Code neben dem Secret gelistet ist und was ich als Offset zur Secret-Entstehungszeit begreife. In meinem Falle steht da 30 Sekunden und alle 30 Sekunden ändern sich die Ziffern, die aus dem immer gleichen Secret generiert werden. Nur hat das einmal nicht funktioniert, als ich die Zahlen fortlaufend ändern ließ. Es funktionierte dann aber, als ich den Prozess wieder neu angeworfen habe. Das kann Zufall sein, oder einfach eine Drift zwischen unterschiedlichen laufenden Uhren. Ich wollte das erwähnen, aber sollte nicht gegen das Prinzip stehen, wie du es erklärt hast.
Vermutlich starten die Handy-Apps jede Anfrage nur einmal, zeigen also nur eine einmalig im Zeitfenster generierte Zahlenfolge an?
Keepasscx stellt die Zahlen fortlaufend dar (zumindest in meiner jetzt gesetzten Einstellung).

Spontan wuerde ich dann noch immer sagen: Android-Emulation.
für ein anderes Problem hatte ich das auch schon mal probiert und fand seinerzeit dieses Android nicht wunderlich stabil. Es handelte sich aber auch nicht um ein übliches Android, sondern um eine 686er-Version, die es auch irgendwo gab, aber nicht ganz so aktuell, wie die offiziellen Versionen.
Es bleibt dann aber das Problem (kein technisches Problem), dass ich eine App installieren muss, für die ich bei google meine Hosen runter lassen muss, denn ohne google-Account kommt man ja nicht in deren App-Store. Ich habe das bewusst so formuliert, weil dadurch mein Widerwille deutlich gemacht wird und hoffentlich klar wird, dass er nur in meiner Sturköpfigkeit begründet ist.

Ich habe gar nichts gegen google und alle Leute finden ganz toll, dass sie alle Apps auf einem Platz im Playstore finden. Ich nicht. Ich denke, wenn jemand möchte, dass ich eine App benutzen soll, dann soll er sie mir auch anbieten und wenn er selbst das nicht kann, soll er auf Anbieter verweisen, die die Apps offen zugänglich machen, ohne dass google da involviert ist.
Vermutlich bin ich der letzte Mohikaner, der noch ohne Apps auf dem Smartphone ist. Gefühlt habe ich das nun 20 Jahre ausgehalten. Wenn ich noch so zwei oder drei Jahre ohne App überstehen kann, habe ich es gepackt und kann das Smartphone ganz weg werfen. Hoffentlich.
 
so hatte ich es tatsächlich verstanden und wenn ich es falsch dargestellt habe, danke ich für die Klarstellung.

Vielleicht nur mit wenigen Anmerkungen: die angezeigten Zahlen (das Ergebnis der Secret-Auswertung durch eine SW), ändern sich laufend. Dazu wird ein Intervall vorgegeben, das im QR-Code neben dem Secret gelistet ist und was ich als Offset zur Secret-Entstehungszeit begreife. In meinem Falle steht da 30 Sekunden und alle 30 Sekunden ändern sich die Ziffern, die aus dem immer gleichen Secret generiert werden. Nur hat das einmal nicht funktioniert, als ich die Zahlen fortlaufend ändern ließ. Es funktionierte dann aber, als ich den Prozess wieder neu angeworfen habe. Das kann Zufall sein, oder einfach eine Drift zwischen unterschiedlichen laufenden Uhren. Ich wollte das erwähnen, aber sollte nicht gegen das Prinzip stehen, wie du es erklärt hast.
Vermutlich starten die Handy-Apps jede Anfrage nur einmal, zeigen also nur eine einmalig im Zeitfenster generierte Zahlenfolge an?
Keepasscx stellt die Zahlen fortlaufend dar (zumindest in meiner jetzt gesetzten Einstellung).

Ja, leicht unterschiedliche Uhren können da ein Problem sein. Auch kannst du natürlich in dem Moment deine Zahlen eingeben, in der sich gerade das 30 Sek-Fenster ändert. In der Regel gibt es bei den Diensten auch eine Toleranz, dass auch die Zahlen von vor einer Minute oder so noch akzeptiert werden, oder auch für die zukünftige Minute, aber das ist unterschiedlich.
 
pass, oder alternativ gopass,ersteres stellt ein shellskript, zweiteres die Reimplementierung in golang, dar.

Ich nutze als Passwordmanager mittlerweile gopass, kann daher nicht genau sagen, ob es die totp Option gibt, pass selbst bietet es an.

Dabei wird das secret hinterlegt, den token kann man sich via cli Option generieren / anzeigen lassen.

pass arbeitet hier mit einem git repo im Hintergrund und verschlüsselt die Zugangsdaten in einzelnen Files, je credential.

Dadurch kann man sich als Angreifer zwar auf die lohnenswertesten Ziele konzentrieren. Man muss seine Passwörter aber auch nicht bei github in nem public Repo hosten.

Browserplugins gibt es entsprechend ebenfalls. Für cli ninjas eine durchaus gangbarer Weg, etwas Einarbeitung vorausgesetzt.

PS: Die Skriptversion pass ist neben portmaster eine gute Quelle wenn man sich Shell Skripting beibringen will.

PS2: Evtl. kann man sich dort auch ansehen wie die Ziffernfolge selbst generiert wird.
 
Zuletzt bearbeitet:
Ja, leicht unterschiedliche Uhren können da ein Problem sein.
zwar habe ich eine funktionierende Lösung, doch manchmal halte ich mich an Details unnötig auf.

keepasscx macht es mir also gut und grundlegend richtig.

Nun habe ich es in einer zweiten VM (nur nebenbei bemerkt: irgendeinem Ubuntu und offenbar mittels Flat-Pack) installiert und einfach mal in zwei unterschiedlichen VMs den gleichen Secret in ein keepassxc eingegeben und die Zahlen angesehen, die dann im Idealfall auch gleichzeitig neu berechnet werden sollten.
Weil ich mich nie genau genug ausdrücke: ich habe also so getan, als wenn ich zwei unterschiedliche Smartphones hätte, die den gleichen QR-Code eingescannt haben und die gleiche 2FA-SW benutzen, um aus dem gleichen Secret (innerhalb des QR-Codes), nun auch gleiche Ziffernfolgen alle 30 Sekunden generieren sollten.
Das keepassxc auf meinem FreeBSD (wenn ich das hätte) und in einer Ubuntu-VM und einer anderen Linux-VM und einer Windwos-VM und auf jedem Smartphone mit entsprechender App, sollte eigentlich sehr synchron alle 30 Sekunden die generierte Ziffernfolge wechseln und dann immer gleiche Zahlen liefern.

Stattdessen laufen bei mir die Zahlen sehr schnell auseinander. Einmal stand die gleiche Zahl noch immer im Display, während sie auf der anderen Anwendung schon zwei mal gewechselt hatte. Direkt nach einem Wechsel waren dann beide Zahlen wieder gleich.
Daraus leite ich als gute Praxis das Verhalten ab, mit der Eingabe so lange zu warten, bis die Ziffernfolge gerade gewechselt hat (wenn man die Anzeige über längere Zeit laufen lassen hat).
 
pass, oder alternativ gopass,ersteres stellt ein shellskript, zweiteres die Reimplementierung in golang, dar.

Ich nutze als Passwordmanager mittlerweile gopass, kann daher nicht genau sagen, ob es die totp Option gibt, pass selbst bietet es an.
das habe ich nicht geschafft. gopass soll laut eines Textes totp on board haben und sogar einfacher, als mittels pass.
Ich glaube, dass meine größte Hürde darin bestand, dass ich alle versuchten Kommandos direkt und ohne Konfiguration, ohne Datenbank und ohne Passworte machte. Die Funktion des PW-Managers wollte ich ja nicht und glaubte daher, dass ich auch darauf verzichten kann, User usw überhaupt anlegen zu müssen.
Ohne diese Vorarbeit, kann ich aber auch keepasscx nicht nutzen, weshalb sie wohl doch immer benötigt wird, soweit ich das nun sehe. Einem Nutzer wird ein Schlüssel zugeordnet, dem Schlüssel wird das Secret aus dem QR-Code übergeben, daraus kann die totp ausgerollt werden.

PS2: Evtl. kann man sich dort auch ansehen wie die Ziffernfolge selbst generiert wird.
das wäre natürlich interessant, wird aber meinen Horizont übersteigen.
 
zwar habe ich eine funktionierende Lösung, doch manchmal halte ich mich an Details unnötig auf.

keepasscx macht es mir also gut und grundlegend richtig.

Nun habe ich es in einer zweiten VM (nur nebenbei bemerkt: irgendeinem Ubuntu und offenbar mittels Flat-Pack) installiert und einfach mal in zwei unterschiedlichen VMs den gleichen Secret in ein keepassxc eingegeben und die Zahlen angesehen, die dann im Idealfall auch gleichzeitig neu berechnet werden sollten.
Weil ich mich nie genau genug ausdrücke: ich habe also so getan, als wenn ich zwei unterschiedliche Smartphones hätte, die den gleichen QR-Code eingescannt haben und die gleiche 2FA-SW benutzen, um aus dem gleichen Secret (innerhalb des QR-Codes), nun auch gleiche Ziffernfolgen alle 30 Sekunden generieren sollten.
Das keepassxc auf meinem FreeBSD (wenn ich das hätte) und in einer Ubuntu-VM und einer anderen Linux-VM und einer Windwos-VM und auf jedem Smartphone mit entsprechender App, sollte eigentlich sehr synchron alle 30 Sekunden die generierte Ziffernfolge wechseln und dann immer gleiche Zahlen liefern.

Stattdessen laufen bei mir die Zahlen sehr schnell auseinander. Einmal stand die gleiche Zahl noch immer im Display, während sie auf der anderen Anwendung schon zwei mal gewechselt hatte. Direkt nach einem Wechsel waren dann beide Zahlen wieder gleich.
Daraus leite ich als gute Praxis das Verhalten ab, mit der Eingabe so lange zu warten, bis die Ziffernfolge gerade gewechselt hat (wenn man die Anzeige über längere Zeit laufen lassen hat).

Ich habe hier 2 Smartphones mit FreeOTP - der OTP App meiner Wahl - die generieren alle im 30 Sekundentakt gleiche Keys.
Eventuell sind bei deinen VMs die Uhren nicht synchron? Eventuell generiert Keypass auch keine neuen Zahlen, wenn die Anwendung nicht aktiv im Vordergrund läuft, könnte ich mir vorstellen, weiß ich aber nicht, da ich das Feature mit Keepassxc nicht nutze.

Wie oben schon geschrieben, haben die Dienste wo du dich mit 2FA anmeldet eigentlich immer ein leicht größeres Zeitfenster als ganau die 30 Sekunden, da eben Uhren schnell mal ein paar Sekunden abweichen. Du musst also nicht immer warten, bis neue Zahlen generiert werden.

das habe ich nicht geschafft. gopass soll laut eines Textes totp on board haben und sogar einfacher, als mittels pass.
Ich glaube, dass meine größte Hürde darin bestand, dass ich alle versuchten Kommandos direkt und ohne Konfiguration, ohne Datenbank und ohne Passworte machte. Die Funktion des PW-Managers wollte ich ja nicht und glaubte daher, dass ich auch darauf verzichten kann, User usw überhaupt anlegen zu müssen.
Ohne diese Vorarbeit, kann ich aber auch keepasscx nicht nutzen, weshalb sie wohl doch immer benötigt wird, soweit ich das nun sehe. Einem Nutzer wird ein Schlüssel zugeordnet, dem Schlüssel wird das Secret aus dem QR-Code übergeben, daraus kann die totp ausgerollt werden.


das wäre natürlich interessant, wird aber meinen Horizont übersteigen.

Zumindest für pass ist OPT Funktion eine Extention die man nachinstallieren muss, pass-otp sollte das Paket sein.
 
Zurück
Oben