首页 >后端开发 >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 中的 HOTP (RFC-4226) 实现与 Golang

在 Golang 中实现 HOTP (RFC-4226) 时,可能会出现差异与 Java 相比,在生成有效的 HOTP 方面。为了解决这个问题,有必要了解 Java 和 Golang 之间字节处理的细微差别。

字节表示

在 Java 中,字节类型是有符号的,范围是-128到127。然而,在Golang中,byte类型是uint8的别名,导致范围是0到255。这种区别对于理解字节数组比较至关重要。

Java 实现

Java 代码片段使用 ByteBuffer.allocate(8).putLong(counter).array() 来生成计数器值的字节数组。具体来说,putLong 方法将计数器转换为 8 字节长的整数,并将其存储在字节数组中。

Golang 实现

在 Golang 中,代码使用二进制.BigEndian.PutUint64(bs, counter) 生成计数器值的字节数组。 PutUint64 方法将计数器转换为 64 位无符号整数,并以大端顺序存储在字节数组中。

字节值差异

差异这两种方法之间的区别源于字节类型的有符号与无符号性质。当 Java 代码将负计数器值转换为字节数组时,生成的字节将被解释为有符号值。相比之下,Golang 的转换保留了计数器值的无符号性质。

解决方案

为了补偿不同的字节解释,需要对负 Java 字节值进行移位256 以获得无符号值。

Base64 与 Hex编码

Java 和 Golang 实现之间的另一个差异在于所使用的编码方案。 Java 实现返回十六进制编码的字符串,而 Golang 实现返回 base64 编码的字符串。为了使 HOTP 结果匹配,必须确保两种实现使用相同的编码方案。

其他提示

  • 为了视觉清晰,请在以下位置显示字节值比较结果时为十六进制或无符号形式。
  • 要显示带符号的 Golang 字节,请先将其转换为 int8

通过考虑字节表示的细微差别和编码差异,您可以解决 HOTP (RFC-4226) 的 Java 和 Golang 实现之间的差异。

以上是为什么 Java 和 Golang HOTP (RFC-4226) 实现会产生不同的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

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