我正在努力实施OTP Google Acc。兼容。
到目前为止,我一直在使用
-RFC2104(http://www.ietf.org/rfc/rfc2104.txt),
-RFC4226(http://www.ietf.org/rfc/rfc4226.txt),
-RFC6238(https://tools.ietf.org/html/rfc6238),并遵循此架构:
[伪码时间OTP](http://en.wikipedia.org/wiki/Google_Authenticator#Pseudocode_for_Time_OTP)
function GoogleAuthenticatorCode(string secret)
key := base32decode(secret)
message := floor(current Unix time / 30)
hash := HMAC-SHA1(key, message)
offset := value of last nibble of hash
truncatedHash := hash[offset..offset+3] //4 bytes starting at the offset
Set the first bit of truncatedHash to zero //remove the most significant bit
code := truncatedHash mod 1000000
pad code with 0 until length of code is 6
return code
直到“hash:= HMAC-SHA1(key,message)”一切正常。我通过其他HMAC-SHA1转换器多次检查结果。 (好吧,我想是的。)
但是,我认为必须出问题...因为很明显我没有得到与我的google-authenticator应用程序(android)相同的代码。 (至少它仍然是一个6位数的值)。
我不太安静的部分是:
offset := value of last nibble of hash
truncatedHash := hash[offset..offset+3] //4 bytes starting at the offset
Set the first bit of truncatedHash to zero //remove the most significant bit
有人能给我一个更详细的解释吗?
谢谢,
答案 0 :(得分:0)
我的猜测是你可能会错误地使用offset
的值。
声明
如果您没有正确的位和字节排序定义,那么散列的最后一个半字节的值
非常模糊。 引用的维基百科页面包含许多实现的链接,我认为this Java implementation可以检查您的代码:
byte[] hash = ...
// Dynamically truncate the hash
// OffsetBits are the low order bits of the last byte of the hash
int offset = hash[hash.length - 1] & 0xF;