Erstellen eines QR-Codes für die Google Authenticator-App (im Folgenden als App bezeichnet) in Java mithilfe von ZXing (z. B. Zebrastreifen). Selbst wenn ich es im Internet nachschlage, werden japanische Informationen nicht angezeigt, daher werde ich sie im Artikel belassen.
Ich habe mich auf diesen Bereich bezogen. https://remotestance.com/blog/2940/ https://github.com/google/google-authenticator/wiki/Key-Uri-Format http://weblabo.oscasierra.net/java-zxing-3/
Geben Sie zunächst den Code des Teils ein, der den QR-Code tatsächlich zeichnet.
main.java
String contents = "otpauth://totp/" + serviceName + ":" + userId+
"?secret=" + secretKey +
"&issuer=" + issuer +
"&algorithm=SHA1" +
"&digits=6" +
"&period=30";
BarcodeFormat format = BarcodeFormat.QR_CODE;
int width = 320;
int height = 320;
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
QRCodeWriter writer = new QRCodeWriter();
BitMatrix bitMatrix = writer.encode(contents, format, width, height, hints);
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
Eine Beschreibung der Variablen, die plötzlich im Code erscheinen. serviceName: Der Name des Dienstes userId: Ein Name, der den Benutzer identifiziert Emittent: Name des Emittenten secretKey: Schlüsselzeichenfolge
Die oberen drei werden verwendet, um den Namen des Schlüssels zu erstellen, und der vierte secretKey ist die Startzeichenfolge. Wenn beispielsweise serviceName Tokyo, Issuer Japan und userId Chuo ist, lautet der in der App angezeigte Schlüsselname "Japan (Tokyo: Chuo)". Es wird nicht nur angezeigt, sondern wenn Sie den QR-Code mit demselben Namen in der App scannen, wird der zuvor gespeicherte Code ohne Erlaubnis überschrieben. Achten Sie daher darauf, denselben Namen nicht in einem anderen Dienst zu verwenden.
Das Verhalten ändert nichts daran, ob Algorithmus, Ziffern oder Punkt angegeben sind. Auch wenn in Zukunft kompatible Apps angezeigt werden, ändern sich die Spezifikationen nicht. Wenn Sie den QR-Code sauberer gestalten möchten, sollten Sie ihn löschen.
Setzen Sie den secreteKey auf die Base32-codierte Schlüsselzeichenfolge. Bei der Verwendung von Google Authenticator wird natürlich ein OTP (Einmalkennwort) auf der Serverseite erstellt. Sie müssen daher die Konsistenz damit berücksichtigen. Bei der Implementierung in Java wird dies wahrscheinlich am häufigsten für die OTP-Generierung verwendet https://tools.ietf.org/html/rfc6238 Wahrscheinlich. Hier ist ein Codebeispiel für den OTP-Erstellungsteil unter der Annahme, dass die TOTP-Klasse durch Kopieren des gesamten in RFC6238 enthaltenen Java-Codeteils nach TOTP.java erstellt wird.
main.java
String seed = DatatypeConverter.printHexBinary(SecureRandom.getSeed(20));
Date date = new Date();
long T0 = 0;
long X = 30;
long testTime = date.getTime()/1000;
long T = (testTime - T0)/X;
String steps = Long.toHexString(T).toUpperCase();
while (steps.length() < 16) steps = "0" + steps;
String otp = TOTP.generateTOTP(seed, steps, "6");
Da die App nur SHA1 unterstützt, beträgt die Startlänge 20 Byte (40 Hexadezimalzeichen) und die aufzurufende Funktion gilt für SHA1. Speichern Sie diesen Samen irgendwo.
Und der Code zum Erstellen der Schlüsselzeichenfolge aus Seed lautet wie folgt.
main.java
byte byte_seed[] = DatatypeConverter.parseHexBinary(seed);
String secretKey = new Base32().encodeToString(byte_seed);
Verwenden Sie den secretKey, der als secretKey der QR-Code-Zeichenfolge ausgegeben wurde.
Recommended Posts