ホームページ > バックエンド開発 > Golang > Java と Golang の HOTP 実装: 不一致を解決するには?

Java と Golang の HOTP 実装: 不一致を解決するには?

DDD
リリース: 2024-12-10 19:18:17
オリジナル
599 人が閲覧しました

Java vs. Golang HOTP Implementation: How to Resolve Discrepancies?

HOTP の Java と Golang (rfc-4226)

Golang で HOTP を実装しようとすると、Java 実装と Golang 実装によって生成される出力の間に不一致が発生する可能性があります。 。これは、2 つの言語のバイト配列の処理方法、特に符号付き値と符号なし値を処理する方法の微妙な違いに起因すると考えられます。

Java と Golang のバイト型

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 サイトの他の関連記事を参照してください。

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