現在、Googleワンタイムパスワードジェネレータを再作成しようとしています。 Google認証システムを設定するときに生成された共有秘密情報を使用します。 私はGoogle Authenticatorのソースを調べ、実際にインターネット上のすべてを調べてみましたが、コードとの類似点はたくさんありますが、私が間違っている場所を見つけることはできません。 最初の部分は正しいようです。 hmacに関しては、私はここで混乱するとは思わないが、私は間違っているかもしれない。切り詰め部分はまだ私のために少しぼやけていて、私はさまざまな実装を試しましたが、私はうまくいくOTPを手に入れることができません。 (私は結果を比較するためにGoogle認証を使用しています)Google OTP生成Java
private String truncateHash(byte[] hash) {
int offset = hash[hash.length - 1] & 0xF;
long truncatedHash = 0;
for (int i = 0; i < 4; ++i) {
truncatedHash <<= 8;
truncatedHash |= (hash[offset + i] & 0xFF);
}
truncatedHash &= 0x7FFFFFFF;
truncatedHash %= 1000000;
int code = (int) truncatedHash;
String result = Integer.toString(code);
for (int i = result.length(); i < 6; i++) {
result = "0" + result;
}
return result;
}
private byte[] hmacSha1(byte[] value, byte[] keyBytes) {
try {
Mac mac = HmacUtils.getHmacSha1(keyBytes);
byte[] rawHmac = mac.doFinal(value);
return new Hex().encode(rawHmac);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String GoogleAuthenticatorCode(String secret) throws UnsupportedEncodingException {
Base32 base = new Base32();
byte[] key = base.decode(secret);
//Update from Andrew Rueckert's response
long value = new Date().getTime()/TimeUnit.SECONDS.toMillis(30);
byte[] data = new byte[8];
for (int i = 8; i-- > 0; value >>>= 8) {
data[i] = (byte) value;
}
//
System.out.println("Time remaining : " + new Date().getTime()/1000 % 30);
byte[] hash = hmacSha1(data, key);
return truncateHash(hash);
}
UPDATE: 私はコピーを試してみましたが、アンドリューRueckertの応答者のリンクからコードだけでなく、この1 https://github.com/wstrange/GoogleAuth/blob/master/src/main/java/com/warrenstrange/googleauth/GoogleAuthenticator.java
とRFC 4226
から1を貼り付けます。これらのどちらも正しいOTPを教えてくれません
誰も私を啓発できますか?
ねえ、アドバイスに感謝。しかし、それはまだ動作していないようです。私はあなたのリンクだけでなく、この1つのhttps://github.com/wstrange/GoogleAuth/blob/master/src/main/java/com/warrenstrange/googleauth/GoogleAuthenticator.javaのコードをコピーして貼り付けようと試みました。 RFC 4226から。どちらも正しいOTPを与えてくれません。 –
'hmacSha1'では、' return new Hex()。encode(rawHmac); 'の代わりに、' return rawHmac; 'を試してください。私は私の実装でHexを全く使用していません。 –