Im Versuch Bei der Implementierung von HOTP mit Java und Golang wurde eine Diskrepanz bei den generierten Werten festgestellt. Während Java erfolgreich ein gültiges HOTP erstellte, unterschied sich die Golang-Implementierung.
Das Problem ergibt sich aus der unterschiedlichen Darstellung von Bytetypen in Java und Go . Javas Byte ist vorzeichenbehaftet und reicht von -128 bis 127, während Golangs Byte ein Alias von uint8 ist und von 0 bis 255 reicht.
Im Java-Code ist die Zeile ByteBuffer.allocate(8).putLong(counter ).array(); Erzeugt aus dem Zählerwert ein Array von Bytes. In Golang konvertiert jedoch „binary.BigEndian.PutUint64(bs, counter)“ den Zähler in eine Big-Endian-Darstellung, was zu unterschiedlichen Bytewerten führt.
Um den Java-Code nach Go zu portieren und sicherzustellen, dass dasselbe Byte-Array generiert wird, müssen negative Werte im Java-Array zur Konvertierung um 256 verschoben werden sie in vorzeichenlose Ganzzahlen um. Dies kann mit dem folgenden Code erreicht werden:
for (int i = 0; i < javabytes.length; i++) { if (javabytes[i] < 0) { javabytes[i] += 256; } }
Beachten Sie außerdem, dass der Java-Code für das Endergebnis eine Hex-Kodierung verwendet, während der Golang-Code die Base64-Kodierung verwendet. Um mit der Java-Ausgabe übereinzustimmen, muss man hex.EncodeToString(h.Sum(nil)) im Golang-Code verwenden.
Das obige ist der detaillierte Inhalt vonJava vs. Golang HOTP-Implementierung: Warum die Diskrepanz bei den generierten Werten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!