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 の結果を一致させるには、両方の実装で同じエンコード スキームが使用されていることを確認する必要があります。
追加のヒント
バイト表現のニュアンスとエンコードの違いを考慮することで、HOTP (RFC-4226) の Java 実装と Golang 実装の間の不一致を解決できます。
以上がJava と Golang HOTP (RFC-4226) の実装で異なる結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。