Maison >développement back-end >Golang >Pourquoi les implémentations Java et Golang HOTP (RFC-4226) produisent-elles des résultats différents ?

Pourquoi les implémentations Java et Golang HOTP (RFC-4226) produisent-elles des résultats différents ?

DDD
DDDoriginal
2024-12-11 02:17:11262parcourir

Why Do Java and Golang HOTP (RFC-4226) Implementations Produce Different Results?

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

  • Pour plus de clarté visuelle, affichez les valeurs d'octet dans hexadécimal ou non signé lors de la comparaison des résultats.
  • Pour afficher les octets Golang signés, convertissez-les en int8 avant impression.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn