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.