RFC4226 HOTP Java 实现

2022-09-04 03:29:35

我试图复制HOTPAlgorithm.java代码(HOTPAlgorithm.java),并将其与官方RFC4226文档第27页上的官方HOTP RFC 4226的示例实现(RFC4226第27页)进行比较。HOTPAlgorithm.java和RFC4226中的实现都是由同一位作者Loren Hart编写的,并设置为1.0版本。从我的比较来看,这两个代码是相同的。

我尝试为6位HOTP代码运行测试向量(不修改HOTPAlgorithm.java脚本),并注意到RFC4226和HOTPAlgorithm.java中给出的源代码与已发布的RFC4226结果产生不同的测试向量结果,具有完全相同的设置。

与 RFC4226 测试向量相比,RFC4226 示例 Java 代码和 HOTPAlogrithm 发布的 Java 代码.java是否存在差异?

来自HOTPAlgorithm.java和RFC4226 Java代码的测试结果(两者都产生相同的结果):

755224
030356
132975
957805
463120
994243
844697
570244
487336
025740

来自 RFC4226 出版物的测试向量 (RFC4226 第 32 页)

755224
287082
359152
969429
338314
254676
287922
162583
399871
520489

我是否遗漏了某些内容,或者官方发布的示例代码与官方发布的结果之间存在差异?


答案 1

改变

int otp = binary % DIGITS_POWER[codeDigits];

int otp = (int) (binary % Math.pow(10, codeDigits));

int otp = binary % 1000000;

答案 2

对 Math.pow() 的更改没有任何区别,但我认为您可能正在调用 generateOTP() 以 0 作为截断Offset 参数值。使用 -1 尝试此操作会得到参考测试向量。


推荐