HOTP - 正确使用RFC样本

时间:2018-06-19 08:11:06

标签: java

我目前正在尝试使用RFC4226 - HOTP: An HMAC-Based One-Time Password Algorithm作为基础的示例。

我拿了代码示例并添加了:

public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {
    // Seed
    String secret = "12345678901234567890";
    byte[] secretBytes = secret.getBytes();

    int counter;
    for (counter = 0; counter < 9; counter++) {
        String strGeneratedToken = OneTimePasswordAlgorithm.generateOTP(secretBytes, counter, 6, false, 0);
        System.out.println(strGeneratedToken);
    }
}

我得到的只是:

755224 717529 868666 023335 179456 490877 910469 467724 952310

第一个是好的,但下一个(计数器= 1)符合RFC( 755224 287082 359152 969429 338314 254676 287922 162583 399871 520489)。

我已将我的代码上传到GitHub https://github.com/n0l0cale/hotp - 也许有人能够看到问题。

这个实现似乎有同样的问题: http://read.pudn.com/downloads158/sourcecode/others/706340/MessageAuthenticationExample.java__.htm

我绝不会,但是当我为My Java Application和My Google Authenticator App尝试相同的秘密时,我也会得到其他代码。 “12345678901234567890”当然不是秘密,但我尝试使用相同的密码短语,谷歌身份验证器应用程序似乎开始他们的计数器0,但增加他们的计数器与它的第一次使用...

1 个答案:

答案 0 :(得分:1)

truncationOffset似乎需要设置为16 .....

String strGeneratedToken = OneTimePasswordAlgorithm.generateOTP(secretBytes,counter,6,false, 16 );

public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {
    // Seed
    String secret = "12345678901234567890";
    byte[] secretBytes = secret.getBytes();

    int counter;
    for (counter = 0; counter < 9; counter++) {
        String strGeneratedToken = OneTimePasswordAlgorithm.generateOTP(secretBytes, counter, 6, false, 16);
        System.out.println(strGeneratedToken);
    }
}

755224 287082 359152 969429 338314 254676 287922 162583 399871 520489