【问题标题】:RFC4226 HOTP Java ImplementationRFC4226 HOTP Java 实现
【发布时间】:2015-08-04 04:47:29
【问题描述】:

我尝试复制 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

是我遗漏了什么还是官方发布的示例代码和官方发布的结果之间存在差异?

【问题讨论】:

  • 你有没有让参考实现工作?我已经尝试过和你一样的方法,但是对于count=0,我使用参考实现得到了882301。如果你还没有让它工作,我想问题在于测试向量是否错误,或者实现。
  • 文件好像没有了。我在这里找到了一个具有相同代码的类似文件:gist.github.com/ibnfirnas/27ff6ae47b2f60ed733c

标签: java one-time-password hmacsha1


【解决方案1】:

改变

int otp = binary % DIGITS_POWER[codeDigits];

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

或者

int otp = binary % 1000000;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 2019-01-26
      • 2020-07-31
      • 1970-01-01
      • 2017-04-02
      • 2012-06-03
      • 2012-09-04
      • 2020-10-24
      相关资源
      最近更新 更多