Heim >Backend-Entwicklung >Golang >Warum generieren Java und Go unterschiedliche HOTP-Werte und wie kann ich die Diskrepanz beheben?

Warum generieren Java und Go unterschiedliche HOTP-Werte und wie kann ich die Diskrepanz beheben?

Linda Hamilton
Linda HamiltonOriginal
2024-12-11 04:56:13861Durchsuche

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

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn