RFC4226 HOTP Java实现

gsu*_*nic 12 java erlang-otp one-time-password hmacsha1

我尝试复制HOTPAlgorithm.java代码(HOTPAlgorithm.java),并将其与官方RFC4226文档第27页上的官方HOTP RFC 4226示例实现(RFC4226)进行比较.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
Run Code Online (Sandbox Code Playgroud)

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

755224
287082
359152
969429
338314
254676
287922
162583
399871
520489
Run Code Online (Sandbox Code Playgroud)

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

tho*_*olh 7

更改

int otp = binary % DIGITS_POWER[codeDigits];
Run Code Online (Sandbox Code Playgroud)

int otp = (int) (binary % Math.pow(10, codeDigits));
Run Code Online (Sandbox Code Playgroud)

要么

int otp = binary % 1000000;
Run Code Online (Sandbox Code Playgroud)


小智 5

对 Math.pow() 的更改没有任何区别,但我认为您可能会使用 0 作为 truncationOffset 参数值来调用generateOTP()。用 -1 尝试给出参考测试向量。