Golang で HOTP を実装しようとすると、Java 実装と Golang 実装によって生成される出力の間に不一致が発生する可能性があります。 。これは、2 つの言語のバイト配列の処理方法、特に符号付き値と符号なし値を処理する方法の微妙な違いに起因すると考えられます。
Java のバイト型は符号付きであることを意味します。その範囲は -128 ~ 127 ですが、Golang のバイト型は uint8 のエイリアスであり、範囲は 0 ~ 255 です。この違いにより、それぞれの言語で生成されるバイト配列が異なります。
Java と Golang で生成されたバイト配列を比較するには、符号付き Java バイト値を対応する符号なし値に変換します。これは、負の値に 256 を加算することで実現できます。
for (byte b : javabytes) { if (b < 0) { b += 256; } }
または、ビット単位の演算を使用して、Java バイト値を符号なし形式で表示できます。
byteValue &= 0xff;
Java と Golang のもう 1 つの違いは、長整数のバイト順序です。 Java はビッグエンディアンのバイト順序に従いますが、Golang はリトルエンディアンのバイト順序を使用します。これは、バイト配列内のバイトの順序が 2 つの言語間で異なることを意味します。
Java と Golang の間で一貫したバイト順序を確保するには、次のようにします。 Java のビッグエンディアンのバイト配列を Golang のリトルエンディアン形式に変換するために必要です。これは、外部ライブラリを使用するか、バイト順序を手動で交換することによって実現できます。
提供されたコード スニペットでは、Java 実装は 16 進エンコードされた結果を返しますが、Golang 実装は返します。 Base64 でエンコードされた結果。 Java 出力と一致させるには、Golang で hex.EncodeToString 関数を使用できます。
return hex.EncodeToString(h.Sum(nil))
Go のバイト値を符号付き形式で表示するには、次のように変換できます。それらを int8 (符号付き型) に変換します。
for _, b := range gobytes { fmt.Print(int8(b), " ") }
以上がJava と Golang の HOTP 実装: 不一致を解決するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。