Maison >développement back-end >Golang >Pourquoi Java et Go génèrent-ils des valeurs HOTP différentes et comment puis-je corriger l'écart ?
Implémentation Java vs Golang de HOTP (RFC-4226)
Lorsqu'ils tentent d'implémenter HOTP dans Go, les utilisateurs peuvent rencontrer des écarts entre les généré des OTP par rapport à leurs homologues Java. Cet écart résulte souvent de la manière distincte dont ces langages gèrent les types d'octets.
En Java, le type de données octet est signé avec une plage de -128 à 127, tandis qu'en Go, il n'est pas signé avec une plage de 0 à 255. Cette différence se manifeste dans la construction du tableau d'octets représentant la valeur du compteur.
Java Code :
final byte[] b = ByteBuffer.allocate(8).putLong(counter).array();
Go Code :
bs := make([]byte, 8) binary.BigEndian.PutUint64(bs, counter)
L'écart se produit lorsque la valeur du compteur est négative en Java. En comparant les tableaux d'octets générés, les utilisateurs peuvent remarquer une disparité dans le dernier octet de b.
Pour résoudre ce problème, il est nécessaire d'ajuster les valeurs négatives des octets Java en ajoutant 256. Cela déplace la valeur négative vers son équivalent positif, garantissant l'alignement avec l'implémentation Go.
Java Code (Avec Ajustement) :
for (int i = 0; i < b.length; i++) { if (b[i] < 0) { b[i] += 256; } }
De plus, l'encodage utilisé pour le résultat OTP diffère entre les deux langues. Java utilise le codage hexadécimal, tandis que Go utilise Base64 par défaut. Pour assurer la cohérence, modifiez le code Go pour afficher le résultat en utilisant le codage hexadécimal :
Code Go (codage hexadécimal) :
return hex.EncodeToString(h.Sum(nil))
Avec ces ajustements, le HOTP l'implémentation dans Go devrait désormais s'aligner sur son homologue Java, produisant des résultats OTP identiques pour le compteur et les valeurs clés donnés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!