Maison >développement back-end >Golang >Pourquoi les implémentations Java et Golang HOTP (RFC-4226) produisent-elles des résultats différents ?
Implémentation de HOTP (RFC-4226) dans Java par rapport à Golang
Lors de l'implémentation de HOTP (RFC-4226) dans Golang, des divergences peuvent survenir dans la génération de HOTP valides par rapport à Java. Pour résoudre ce problème, il est essentiel de comprendre les différences nuancées dans la gestion des octets entre Java et Golang.
Représentation des octets
En Java, le type d'octet est signé, allant de -128 à 127. Cependant, dans Golang, le type d'octet est un alias pour uint8, ce qui donne une plage de 0 à 255. Cette distinction est cruciale pour comprendre la comparaison des tableaux d'octets.
Implémentation Java
L'extrait de code Java utilise ByteBuffer.allocate(8).putLong(counter). array() pour générer un tableau d'octets pour la valeur du compteur. Plus précisément, la méthode putLong convertit le compteur en un entier de 8 octets et le stocke dans le tableau d'octets.
Implémentation de Golang
Dans Golang, le code utilise le binaire .BigEndian.PutUint64(bs, counter) pour générer un tableau d'octets pour la valeur du compteur. La méthode PutUint64 convertit le compteur en un entier non signé de 64 bits et le stocke dans le tableau d'octets dans l'ordre big-endian.
Différence dans les valeurs d'octet
La différence entre ces deux méthodes découle de la nature signée ou non signée du type d'octet. Lorsque le code Java convertit une valeur de compteur négative en tableau d'octets, les octets résultants sont interprétés comme des valeurs signées. En revanche, la conversion de Golang préserve la nature non signée de la valeur du compteur.
Solution
Pour compenser les différentes interprétations des octets, il est nécessaire de décaler les valeurs d'octet Java négatives par 256 pour obtenir des valeurs non signées.
Base64 vs Hex Encodage
Une autre disparité entre les implémentations Java et Golang réside dans le schéma d'encodage utilisé. L'implémentation Java renvoie une chaîne codée en hexadécimal, tandis que l'implémentation Golang renvoie une chaîne codée en base64. Pour que les résultats HOTP correspondent, il faut s'assurer que les deux implémentations utilisent le même schéma de codage.
Conseils supplémentaires
En considérant les nuances de représentation des octets et les différences d'encodage, vous pouvez résoudre les écarts entre les implémentations Java et Golang de HOTP (RFC-4226).
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!