ホームページ > バックエンド開発 > Golang > Java と Golang の HOTP 実装: 生成された値に不一致があるのはなぜですか?

Java と Golang の HOTP 実装: 生成された値に不一致があるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-16 10:15:13
オリジナル
968 人が閲覧しました

Java vs. Golang HOTP Implementation: Why the Discrepancy in Generated Values?

HOTP の Java と Golang (rfc-4226)

問題: Java 間での HOTP 生成の不一致そしてGolang

Java と Golang を使用して HOTP を実装しようとすると、生成された値に不一致が見つかりました。 Java は有効な HOTP を正常に生成しましたが、Golang の実装は異なりました。

gt;違いを理解する

この問題は、Java と Go でのバイト型の表現が異なることに起因しています。 。 Java のバイトは、-128 から 127 の範囲の符号付きですが、Golang のバイトは、0 から 255 の範囲の uint8 のエイリアスです。

Java コードの行 ByteBuffer.allocate(8).putLong(counter )。配列();カウンタ値からバイトの配列を生成します。ただし、Golang では、binary.BigEndian.PutUint64(bs, counter) はカウンターをビッグエンディアン表現に変換するため、異なるバイト値になります。

Solution

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 バイト値を符号なしで表示するには、byteValue & を使用します。 0xff.
  • Golang バイト値を符号付きで表示するには、それらを int8.
に変換します。

以上がJava と Golang の HOTP 実装: 生成された値に不一致があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート