Heim > Backend-Entwicklung > Golang > Java vs. Golang HOTP-Implementierung: Wie lassen sich Diskrepanzen beheben?

Java vs. Golang HOTP-Implementierung: Wie lassen sich Diskrepanzen beheben?

DDD
Freigeben: 2024-12-10 19:18:17
Original
599 Leute haben es durchsucht

Java vs. Golang HOTP Implementation: How to Resolve Discrepancies?

Java vs. Golang für HOTP (rfc-4226)

Beim Versuch, HOTP in Golang zu implementieren, kann es zu Diskrepanzen zwischen der von Java- und Golang-Implementierungen erzeugten Ausgabe kommen . Dies kann auf subtile Unterschiede in der Art und Weise zurückgeführt werden, wie die beiden Sprachen mit Byte-Arrays umgehen, insbesondere beim Umgang mit vorzeichenbehafteten und vorzeichenlosen Werten.

Java vs. Golang-Bytetypen

Der Bytetyp von Java ist vorzeichenbehaftet, d. h er reicht von -128 bis 127, während der Bytetyp von Golang ein Alias ​​von uint8 ist, der von 0 bis 255 reicht. Dies Unterschiede führen zu Variationen in den von den jeweiligen Sprachen generierten Byte-Arrays.

Konvertierung zwischen vorzeichenbehafteten und vorzeichenlosen Werten

Um die von Java und Golang generierten Byte-Arrays zu vergleichen, ist es notwendig, die vorzeichenbehafteten zu konvertieren Java-Bytewerte in ihre entsprechenden vorzeichenlosen Werte umwandeln. Dies kann durch Addition von 256 zu negativen Werten erreicht werden.

for (byte b : javabytes) {
    if (b < 0) {
        b += 256;
    }
}
Nach dem Login kopieren

Alternativ können Sie Java-Bytewerte in einem vorzeichenlosen Format mithilfe bitweiser Operationen anzeigen:

byteValue &= 0xff;
Nach dem Login kopieren

Byte Order Differences

Ein weiterer Unterschied zwischen Java und Golang ist die Bytereihenfolge langer Ganzzahlen. Java folgt der Big-Endian-Bytereihenfolge, während Golang die Little-Endian-Bytereihenfolge verwendet. Dies bedeutet, dass die Reihenfolge der Bytes im Byte-Array zwischen den beiden Sprachen unterschiedlich sein wird.

Big-Endian-zu-Little-Endian-Konvertierung

Um eine konsistente Byte-Reihenfolge zwischen Java und Golang sicherzustellen, ist dies der Fall erforderlich, um die Big-Endian-Byte-Arrays von Java in das Little-Endian-Format von Golang zu konvertieren. Dies kann mithilfe externer Bibliotheken oder durch manuelles Vertauschen der Bytereihenfolge erreicht werden.

Codierungsunterschiede

In den bereitgestellten Codefragmenten gibt die Java-Implementierung ein hexadezimal codiertes Ergebnis zurück, während die Golang-Implementierung ein Ergebnis zurückgibt ein Base64-codiertes Ergebnis. Um die Java-Ausgabe abzugleichen, können Sie die hex.EncodeToString-Funktion in Golang verwenden.

return hex.EncodeToString(h.Sum(nil))
Nach dem Login kopieren

Vorzeichenbehaftete vs. vorzeichenlose Anzeige

Um die Bytewerte von Go vorzeichenbehaftet anzuzeigen, können Sie konvertieren sie an int8, einen signierten Typ.

for _, b := range gobytes {
    fmt.Print(int8(b), " ")
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonJava vs. Golang HOTP-Implementierung: Wie lassen sich Diskrepanzen beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage