我目前正在尝试重新创建 Google 一次性密码生成器。我使用设置 Google Authenticator 时生成的共享密钥。我尝试查看 Google Authenticator 来源和互联网上的所有内容,发现与我的代码有很多相似之处,但我真的找不到我错在哪里。第一部分似乎是正确的。至于 hmac,我认为我不会在这里搞砸,但我可能是错的。截断部分对我来说仍然有点模糊,我尝试了很多不同的实现,但我就是无法获得有效的 OTP。(我正在使用 Google Authenticator 来比较结果)
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" …Run Code Online (Sandbox Code Playgroud)