首页 >后端开发 >Golang >Java 与 Golang HOTP 实现:为什么生成值存在差异?

Java 与 Golang HOTP 实现:为什么生成值存在差异?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-16 10:15:13970浏览

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

Java 与 Golang 的 HOTP (rfc-4226)

问题:Java 之间的 HOTP 生成差异和Golang

在尝试使用 Java 和 Golang 实现 HOTP 时,发现生成的值存在差异。虽然 Java 成功生成了有效的 HOTP,但 Golang 实现有所不同。

理解差异

问题源于 Java 和 Go 中字节类型的不同表示。 Java的byte是有符号的,范围是-128到127,而Golang的byte是uint8的别名,范围是0到255。

在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 代码使用十六进制编码作为最终结果,而 Golang 代码使用 Base64 编码。为了匹配 Java 输出,必须在 Golang 代码中使用 hex.EncodeToString(h.Sum(nil))。

调试提示

  • 要以无符号方式显示 Java 字节值,请使用 byteValue & 0xff。
  • 要以带符号的方式显示 Golang 字节值,请将它们转换为 int8。

以上是Java 与 Golang HOTP 实现:为什么生成值存在差异?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn