Heim >Backend-Entwicklung >Golang >Warum generieren Java und Go unterschiedliche HOTP-Werte und wie kann ich die Diskrepanz beheben?
Java vs. Golang-Implementierung von HOTP (RFC-4226)
Beim Versuch, HOTP in Go zu implementieren, können Benutzer auf Diskrepanzen zwischen den stoßen generierte OTPs im Vergleich zu ihren Java-Gegenstücken. Diese Abweichung resultiert häufig aus der unterschiedlichen Art und Weise, wie diese Sprachen mit Bytetypen umgehen.
In Java ist der Byte-Datentyp mit einem Bereich von -128 bis 127 signiert, während er in Go mit einem Bereich ohne Vorzeichen versehen ist von 0 bis 255. Dieser Unterschied manifestiert sich in der Konstruktion des Byte-Arrays, das den Zählerwert darstellt.
Java Code:
final byte[] b = ByteBuffer.allocate(8).putLong(counter).array();
Go Code:
bs := make([]byte, 8) binary.BigEndian.PutUint64(bs, counter)
Die Diskrepanz entsteht, wenn der Zählerwert in Java negativ ist. Beim Vergleich der generierten Byte-Arrays stellen Benutzer möglicherweise eine Ungleichheit im letzten Byte von b fest.
Um dieses Problem zu beheben, müssen die negativen Java-Bytewerte durch Hinzufügen von 256 angepasst werden. Dadurch wird der negative Wert verschoben sein positives Äquivalent, das die Ausrichtung mit der Go-Implementierung gewährleistet.
Java-Code (Mit Anpassung):
for (int i = 0; i < b.length; i++) { if (b[i] < 0) { b[i] += 256; } }
Außerdem unterscheidet sich die für das OTP-Ergebnis verwendete Kodierung zwischen den beiden Sprachen. Java verwendet hexadezimale Kodierung, während Go standardmäßig Base64 verwendet. Um Konsistenz zu erreichen, ändern Sie den Go-Code so, dass das Ergebnis mit hexadezimaler Kodierung ausgegeben wird:
Go-Code (Hexadezimalkodierung):
return hex.EncodeToString(h.Sum(nil))
Mit diesen Anpassungen wird der HOTP Die Implementierung in Go sollte nun mit ihrem Java-Gegenstück übereinstimmen und identische OTP-Ergebnisse für die angegebenen Zähler- und Schlüsselwerte liefern.
Das obige ist der detaillierte Inhalt vonWarum generieren Java und Go unterschiedliche HOTP-Werte und wie kann ich die Diskrepanz beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!