RFC4226 HOTP Java实现

时间:2015-05-22 08:35:59

标签: java otp hmacsha1 one-time-password

我尝试复制HOTPAlgorithm.java代码(HOTPAlgorithm.java)并将其与官方RFC4226文档第27页上的官方HOTP RFC 4226示例实现(RFC4226 Page 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 Page 32)的测试向量

755224
287082
359152
969429
338314
254676
287922
162583
399871
520489

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

2 个答案:

答案 0 :(得分:7)

更改

int otp = binary % DIGITS_POWER[codeDigits];

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

或者

int otp = binary % 1000000;

答案 1 :(得分:2)

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