Java と Golang を使用して HOTP を実装しようとすると、生成された値に不一致が見つかりました。 Java は有効な HOTP を正常に生成しましたが、Golang の実装は異なりました。
この問題は、Java と Go でのバイト型の表現が異なることに起因しています。 。 Java のバイトは、-128 から 127 の範囲の符号付きですが、Golang のバイトは、0 から 255 の範囲の uint8 のエイリアスです。
Java コードの行 ByteBuffer.allocate(8).putLong(counter )。配列();カウンタ値からバイトの配列を生成します。ただし、Golang では、binary.BigEndian.PutUint64(bs, counter) はカウンターをビッグエンディアン表現に変換するため、異なるバイト値になります。
Java コードを Go に移植し、同じバイト配列が生成されるようにするには、Java 配列内の負の値を次のようにシフトする必要があります。 256 を使用して符号なし整数に変換します。これは、次のコードを使用して実現できます。
for (int i = 0; i < javabytes.length; i++) { if (javabytes[i] < 0) { javabytes[i] += 256; } }
さらに、Java コードは最終結果に 16 進エンコードを使用するのに対し、Golang コードは Base64 エンコードを使用することに注意してください。 Java 出力と一致させるには、Golang コードで hex.EncodeToString(h.Sum(nil)) を使用する必要があります。
以上がJava と Golang の HOTP 実装: 生成された値に不一致があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。