首頁 >後端開發 >Golang >為什麼 Java 和 Golang HOTP (RFC-4226) 實作會產生不同的結果?

為什麼 Java 和 Golang HOTP (RFC-4226) 實作會產生不同的結果?

DDD
DDD原創
2024-12-11 02:17:11249瀏覽

Why Do Java and Golang HOTP (RFC-4226) Implementations Produce Different Results?

Java 中的HOTP (RFC-4226) 實作與Golang

在Golang 中實作HOTP (RFC-4226) 時,可能會出現差異與Java 相比,在產生有效的HOTP 方面。為了解決這個問題,有必要了解 Java 和 Golang 之間位元組處理的細微差別。

位元組表示

在 Java 中,位元組類型是有符號的,範圍是-128到127。然而,在Golang中,byte型別是uint8的別名,導致範圍是0到255。這種區別對於理解位元組數組比較至關重要。

Java 實作

Java 程式碼片段使用 ByteBuffer.allocate(8).putLong(counter).array() 來產生計數器值的位元組數組。具體來說,putLong 方法將計數器轉換為 8 位元組長的整數,並將其儲存在位元組數組中。

Golang 實作

在 Golang 中,程式碼使用二進位.BigEndian.PutUint64(bs, counter) 產生計數器值的位元組數組。 PutUint64 方法將計數器轉換為 64 位元無符號整數,並以大端順序儲存在位元組數組中。

位元組值差異

差異這兩種方法之間的差異源自於位元組類型的有符號與無符號性質。當 Java 程式碼將負計數器值轉換為位元組數組時,生成的位元組將被解釋為有符號值。相比之下,Golang 的轉換保留了計數器值的無符號性質。

為了補償不同的位元組解釋,需要對負 Java 位元組值進行移位256 以獲得無符號值。

Base64 與 Hex編碼

Java 和 Golang 實作之間的另一個差異在於所使用的編碼方案。 Java 實作傳回十六進位編碼的字串,而 Golang 實作傳回 base64 編碼的字串。為了使 HOTP 結果匹配,必須確保兩種實作使用相同的編碼方案。

其他提示

  • 為了視覺清晰,請在以下位置顯示位元組值比較結果時為十六進位或無符號形式。
  • 要顯示帶符號的Golang 位元組,請先將其轉換為int8

透過考慮位元組表示的細微差別和編碼差異,您可以解決HOTP (RFC- 4226) 的Java 和Golang 實作之間的差異。

以上是為什麼 Java 和 Golang HOTP (RFC-4226) 實作會產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn