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 ?

Pourquoi Java et Go génèrent-ils des valeurs HOTP différentes et comment puis-je corriger l'écart ?

Linda Hamilton
Libérer: 2024-12-11 04:56:13
original
936 Les gens l'ont consulté

Why Do Java and Go Generate Different HOTP Values, and How Can I Fix the Discrepancy?

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();
Copier après la connexion

Go Code :

bs := make([]byte, 8)
binary.BigEndian.PutUint64(bs, counter)
Copier après la connexion

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;
    }
}
Copier après la connexion

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))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal