ホームページ >バックエンド開発 >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 と Golang での HOTP (RFC-4226) 実装

Golang で HOTP (RFC-4226) を実装すると、矛盾が生じる可能性がありますJava と比較して有効な HOTP を生成する点で優れています。この問題に対処するには、Java と Golang の間のバイト処理の微妙な違いを理解することが不可欠です。

バイト表現

Java では、バイト型は署名されています。 -128 から 127 の範囲です。ただし、Golang では、バイト型は uint8 のエイリアスであり、結果の範囲は 0 から 127 になります。 255. この区別は、バイト配列の比較を理解する上で重要です。

Java 実装

Java コード スニペットは ByteBuffer.allocate(8).putLong(counter) を使用します。 array() を使用してカウンタ値のバイト配列を生成します。具体的には、putLong メソッドはカウンターを 8 バイトの長整数に変換し、バイト配列に格納します。

Golang の実装

Golang では、コードはバイナリを使用します。 .BigEndian.PutUint64(bs, counter) を使用して、カウンター値のバイト配列を生成します。 PutUint64 メソッドは、カウンターを 64 ビット符号なし整数に変換し、ビッグエンディアン順でバイト配列に格納します。

バイト値の不一致

違いこれら 2 つの方法の違いは、バイト型の符号付きと符号なしの性質に起因します。 Java コードが負のカウンタ値をバイト配列に変換すると、結果のバイトは符号付き値として解釈されます。対照的に、Golang の変換では、カウンター値の符号なしの性質が保持されます。

解決策

バイト解釈の違いを補うために、負の Java バイト値をシフトする必要があります。 256 で符号なしの値を取得します。

Base64 と 16 進数エンコーディング

Java 実装と Golang 実装の間のもう 1 つの違いは、使用されるエンコーディング スキームにあります。 Java 実装は 16 進数でエンコードされた文字列を返しますが、Golang 実装は Base64 でエンコードされた文字列を返します。 HOTP の結果を一致させるには、両方の実装で同じエンコード スキームが使用されていることを確認する必要があります。

追加のヒント

  • 視覚的にわかりやすくするために、バイト値を に表示します。結果を比較するときは 16 進数または符号なし形式です。
  • 符号付き Golang バイトを表示するには、前に int8 に変換します。

バイト表現のニュアンスとエンコードの違いを考慮することで、HOTP (RFC-4226) の Java 実装と Golang 実装の間の不一致を解決できます。

以上がJava と Golang HOTP (RFC-4226) の実装で異なる結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。