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 结果匹配,必须确保两种实现使用相同的编码方案。
其他提示
通过考虑字节表示的细微差别和编码差异,您可以解决 HOTP (RFC-4226) 的 Java 和 Golang 实现之间的差异。
以上是为什么 Java 和 Golang HOTP (RFC-4226) 实现会产生不同的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!