0

我正在实施 OTP Google Acc。兼容的。

到目前为止,我一直在使用

-RFC2104(http://www.ietf.org/rfc/rfc2104.txt),

-RFC4226(http://www.ietf.org/rfc/rfc4226.txt),

-RFC6238(https://www.rfc-editor.org/rfc/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 

有人可以给我一个更详细的解释吗?

谢谢,

4

1 回答 1

0

offset我的猜测是你可能会错误地取值。该声明

哈希的最后一个半字节的值

如果您没有正确定义位和字节顺序,则非常模糊。引用的维基百科页面有许多实现的链接,我认为这个 Java 实现是用来检查你的代码的东西:

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;
于 2014-12-23T17:04:57.647 回答