Créer un code QR pour Google Authenticator à l'aide de ZXing en Java

Comment créer un code QR pour l'application Google Authenticator (ci-après dénommée application) en Java à l'aide de ZXing (comme le passage clouté). Même si je cherche sur le net, les informations japonaises ne sont pas diffusées, je vais donc les laisser dans l'article.

J'ai fait référence à ce domaine. https://remotestance.com/blog/2940/ https://github.com/google/google-authenticator/wiki/Key-Uri-Format http://weblabo.oscasierra.net/java-zxing-3/

Tout d'abord, mettez le code de la partie qui dessine réellement le code QR.

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);

Une description des variables qui apparaissent soudainement dans le code. serviceName: le nom du service userId: un nom qui identifie l'utilisateur émetteur: nom de l'émetteur secretKey: chaîne de clé

Les trois premiers sont utilisés pour créer le nom de la clé et le quatrième secretKey est la chaîne de départ. Par exemple, si serviceName est Tokyo, Issuer est le Japon et userId est Chuo, le nom de la clé affiché dans l'application sera "Japan (Tokyo: Chuo)". Non seulement il est affiché, mais si vous scannez le code QR avec le même nom dans l'application, celui précédemment enregistré sera écrasé sans autorisation, alors faites attention à ne pas utiliser le même nom dans un autre service.

Le comportement ne change pas si l'algorithme, les chiffres ou la période sont spécifiés. Même si des applications compatibles apparaissent à l'avenir, les spécifications ne changeront pas, donc si vous souhaitez rendre le nettoyeur de code QR, vous devez le supprimer.

Définissez secreteKey sur la chaîne de clé codée en base32. Bien sûr, l'utilisation de Google Authenticator implique le processus de création d'un OTP (mot de passe à usage unique) côté serveur, vous devez donc considérer sa cohérence avec cela. Lorsqu'il est implémenté en Java, c'est probablement le plus utilisé pour la génération OTP https://tools.ietf.org/html/rfc6238 Probablement. Voici un exemple de code de la partie de création OTP en supposant que la classe TOTP est créée en copiant l'intégralité de la partie de code java incluse dans RFC6238 dans TOTP.java.

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");

Étant donné que l'application ne prend en charge que SHA1, la longueur de départ est de 20 octets (40 caractères hexadécimaux) et la fonction à appeler est pour SHA1. Gardez cette graine quelque part.

Et le code pour créer la chaîne de clé à partir de seed est comme ça.

main.java


        byte byte_seed[] = DatatypeConverter.parseHexBinary(seed);
        String secretKey = new Base32().encodeToString(byte_seed);

Utilisez le secretKey qui est sorti comme secretKey de la chaîne de caractères du code QR.

Recommended Posts

Créer un code QR pour Google Authenticator à l'aide de ZXing en Java
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Techniques de lecture du code source Java dans Eclipse
Essayez d'utiliser Sourcetrail (version macOS) avec du code Java
Créer JSON en Java
J'ai essayé d'utiliser l'instruction Extended for en Java
Différences de code lors de l'utilisation du système de longueur en Java
Essayez d'utiliser RocksDB avec Java
Créer des fonctions Azure en Java
Java avec Visual Studio Code
Écrire du code de type Java8 en Java8
Conseils d'utilisation de Salesforce SOAP et de l'API Bulk en Java
L'histoire de l'utilisation de Java Input Wait (Scanner) avec VSCode
Évitez les erreurs de code de caractère en java lors de l'utilisation de l'extension VScode RUN-CODE
Devinez le code de caractère en Java
Les débutants jouent à des jeux Janken en Java
Environnement Java Spring dans vs Code
[Pour les débutants] Exécutez Selenium sur Java
Chiffrer à l'aide du chiffrement RSA en Java
[Java] Élimination du code de plaque de chaudière à l'aide de Lombok
Créer un projet Java à l'aide d'Eclipse
[Java] Élimination du code de plaque de chaudière avec Lombok 2
Connexion HTTPS utilisant tls1.2 dans Java 6
J'ai essayé d'utiliser JWT en Java
Paramètres de débogage SSL dans Java
Exemple de code utilisant Minio de Java
J'ai essayé d'utiliser l'API Elasticsearch en Java
Exemple de code pour l'implémentation Singleton à l'aide d'énumération
Créer des données binaires de longueur variable en Java
Mesure de la mémoire pour les applications Java utilisant jstat
Premiers pas pour l'apprentissage profond en Java
Points clés pour l'introduction de gRPC en Java
Essayez d'utiliser l'API Stream en Java
Mapper sans utiliser de tableau en java
ERRORCODE = -4471 se produit dans une application Java qui utilise Db2.
Essayez d'utiliser l'API au format JSON en Java
Créer un projet Java Spring Boot avec IntelliJ
Autoriser l'achèvement du code dans Eclipse pour Mac
Créer une application TODO dans Java 7 Créer un en-tête
Lire Felica en utilisant RC-S380 (PaSoRi) en Java
Toutes les mêmes chaînes de code de hachage en Java
Mise à jour de l'environnement Java de Windows à l'aide de Chocolatey
[Mac] Installer Java dans Visual Studio Code
Exemple de code source pour trouver le multiple commun minimum de plusieurs valeurs en Java
Impressions et doutes sur l'utilisation de Java pour la première fois dans Android Studio
Créez une animation dans laquelle les personnages émergent un instant avec la méthode de la dynamique moléculaire