MFA/2FA: QR-Codes für TOTP erzeugen mit qrencode
Ich habe mir vor einiger Zeit den ReinerSCT Authenticator zugelegt – ein kleines praktisches Gerät, das 6-stellige Einmal-Codes auf Basis von TOTP erzeugen kann. Das bietet sich z.B. an wenn man es als Backup fürs Smartphone einsetzen möchte, sowie für Personen die für MFA/2FA ein separates Gerät bevorzugen.
Leider ist das Display recht eingeschränkt, sprich es passen nicht allzu viele Zeichen darauf. Daher sind die vorgefertigten QR-Codes wie man sie von den Hersteller-Seiten bekommt, auf dem kleinen Display oft nicht zu entziffern. Diese werden häufig abgeschnitten und man kann sie dann nicht mehr zuordnen. Um einen passenden QR-Code zu erzeugen (natürlich nicht nur für den ReinerSCT), bietet sich das Tool qrencode an.
Es lässt sich unter Debian/Ubuntu über die Pakerverwaltung installieren:
apt install qrencode -y
Wenn wir uns vorher das sog. “Seed” (das Geheimnis auf dessen Basis die Codes erzeugt werden) irgendwo aufgeschrieben haben, können wir nun daraus den QR-Code erzeugen:
qrencode -t UTF8 -o - 'otpauth://totp/Benutzerkonto?secret=ABCDEFHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA&issuer=example.com'
Die geheime Zeichenfolge muss dabei natürlich durch das jeweilige Geheimnis ersetzt werden. Ebenso das Benutzerkonto und die Webseite/der Dienst.
Damit erhält man innerhalb der Konsolensitzung einen QR-Code, den man einfach abscannt:
Möchte man sich den QR-Code in eine PNG-Datei erzeugen lassen, geht das z.B. hiermit:
qrencode -t PNG -o qr.png -s 10 'otpauth://totp/Benutzerkonto?secret=ABCDEFHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA&issuer=example.com'
Benutzt der Aussteller einen anderen Hash-Algorithmus/Anzahl Zeichen/Gültigkeitsdauer, kann man diese Einstellungen ebenfalls in dem String mitgeben. Der Standard sind SHA1, 6 Zeichen und 30 Sekunden.
Hier als Beispiel SHA256, 4 Zeichen und 60 Sekunden.
qrencode -t UTF8 -o - 'otpauth://totp/Benutzerkonto?secret=ABCDEFHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZA&issuer=Firma"&algorithm=SHA256&digits=4&period=60'