Erstellen Sie einen QR-Code für Google Authenticator mit ZXing in Java

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

Erstellen Sie einen QR-Code für Google Authenticator mit ZXing in Java
ChatWork4j für die Verwendung der ChatWork-API in Java
Techniken zum Lesen von Java-Quellcode in Eclipse
Versuchen Sie es mit Sourcetrail (MacOS-Version) mit Java-Code
Erstellen Sie JSON in Java
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Unterschiede im Code bei Verwendung des Längensystems in Java
Versuchen Sie es mit RocksDB mit Java
Erstellen Sie Azure-Funktionen in Java
Java mit Visual Studio Code
Schreiben Sie Java8-ähnlichen Code in Java8
Tipps zur Verwendung von Salesforce SOAP und Bulk API in Java
Die Geschichte der Verwendung von Java Input Waiting (Scanner) mit VSCode
Vermeiden Sie Zeichencodefehler in Java, wenn Sie die VScode-Erweiterung RUN-CODE verwenden
Errate den Zeichencode in Java
Anfänger spielen Janken-Spiele in Java
Java Spring-Umgebung in vs Code
[Für Anfänger] Führen Sie Selenium auf Java aus
Verschlüsselung mit RSA-Verschlüsselung in Java
[Java] Eliminierung des Kesselplattencodes mit Lombok
Erstellen Sie ein Java-Projekt mit Eclipse
[Java] Eliminierung des Kesselplattencodes mit Lombok 2
HTTPS-Verbindung mit tls1.2 in Java 6
Ich habe versucht, JWT in Java zu verwenden
Einstellungen für das SSL-Debugging in Java
Beispielcode mit Minio aus Java
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Beispielcode für die Singleton-Implementierung mit enum
Erstellen Sie Binärdaten variabler Länge in Java
Speichermessung für Java-Apps mit jstat
Erste Schritte für tiefes Lernen in Java
Wichtige Punkte für die Einführung von gRPC in Java
Versuchen Sie es mit der Stream-API in Java
Map ohne Verwendung eines Arrays in Java
ERRORCODE = -4471 tritt in einer Java-Anwendung auf, die Db2 verwendet.
Versuchen Sie es mit der JSON-Format-API in Java
Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt
Ermöglichen Sie die Code-Vervollständigung in Eclipse für Mac
Erstellen Sie eine TODO-App in Java 7 Create Header
Lesen Sie Felica mit RC-S380 (PaSoRi) in Java
Alle gleichen Hash-Code-Zeichenfolgen in Java
Aktualisieren der Java-Umgebung von Windows mit Chocolatey
[Mac] Installieren Sie Java in Visual Studio Code
Beispielquellcode zum Ermitteln des minimalen gemeinsamen Vielfachen mehrerer Werte in Java
Eindrücke und Zweifel an der erstmaligen Verwendung von Java in Android Studio
Erstellen Sie mit der molekulardynamischen Methode eine Animation, in der Charaktere für einen Moment auftauchen