首页 >后端开发 >Golang >为什么 Java 和 Go 生成不同的 HOTP 值,如何修复差异?

为什么 Java 和 Go 生成不同的 HOTP 值,如何修复差异?

Linda Hamilton
Linda Hamilton原创
2024-12-11 04:56:13861浏览

Why Do Java and Go Generate Different HOTP Values, and How Can I Fix the Discrepancy?

HOTP 的 Java 与 Golang 实现 (RFC-4226)

当尝试在 Go 中实现 HOTP 时,用户可能会遇到以下差异:生成的 OTP 与其 Java 对应项进行比较。这种偏差通​​常是由于这些语言处理字节类型的不同方式造成的。

在 Java 中,字节数据类型的有符号范围为 -128 到 127,而在 Go 中,它是无符号的,范围为 -128 到 127 0 到 255。这种差异体现在表示计数器值的字节数组的构造中。

Java代码:

final byte[] b = ByteBuffer.allocate(8).putLong(counter).array();

Go 代码:

bs := make([]byte, 8)
binary.BigEndian.PutUint64(bs, counter)

Java 中计数器值为负数时会出现差异。在比较生成的字节数组时,用户可能会注意到 b 的最后一个字节存在差异。

要解决此问题,需要通过添加 256 来调整负 Java 字节值。这会将负值转换为它的正等价物,确保与 Go 实现保持一致。

Java 代码(带有调整):

for (int i = 0; i < b.length; i++) {
    if (b[i] < 0) {
        b[i] += 256;
    }
}

此外,两种语言之间用于 OTP 结果的编码也不同。 Java 使用十六进制编码,而 Go 默认使用 Base64。为了保持一致性,修改 Go 代码,使用十六进制编码输出结果:

Go 代码(十六进制编码):

return hex.EncodeToString(h.Sum(nil))

通过这些调整,HOTP Go 中的实现现在应该与其 Java 对应部分保持一致,为给定的计数器和键值生成相同的 OTP 结果。

以上是为什么 Java 和 Go 生成不同的 HOTP 值,如何修复差异?的详细内容。更多信息请关注PHP中文网其他相关文章!

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