它无需任何连接即可工作;它甚至可以在平面模式下工作。这是我不明白的。没有连接该怎么办?手机和服务器如何同步以知道那一刻哪个代码是有效的?
#1 楼
Google身份验证器同时支持HOTP和TOTP算法来生成一次性密码。使用HOTP,服务器和客户端共享一个秘密值和一个计数器,这些值和计数器用于分别计算一次密码双方。每当生成并使用密码时,计数器都会在两侧递增,以使服务器和客户端保持同步。
TOTP本质上使用与HOTP相同的算法,但有一个主要区别。 TOTP中使用的计数器被当前时间代替。只要系统时间保持不变,客户端和服务器就保持同步。这可以通过使用网络时间协议来完成。
必须在某个时间点将秘密密钥(以及HOTP情况下的计数器)传达给服务器和客户端。对于Google Authenticator,这是以QRCode编码的URI的形式完成的。有关更多信息,请参见:KeyUriFormat。
评论
对于HOTP,Google身份验证器如何知道我“使用”了密码而不与服务器同步? Google Authenticator所做的是,它会继续闪烁不同的键,而我只能使用其中的任何一个而无需向我的手机提供反馈。
–马里奥·阿瓦德(Mario Awad)
13年5月7日在8:21
@MarioAwad的答案可以在HOTP RFC的7.4节中找到。 ietf.org/rfc/rfc4226.txt
–user10211
13年5月7日在8:24
感谢您对答案和后续步骤的明确定义。 7.4节的快速摘要:时不时地进行计数器的重新同步,并且计数器的超前窗口是使事情运行而无需即时同步的原因。
–马里奥·阿瓦德(Mario Awad)
13年5月7日在11:03
正如@TerryChia指出的那样,密钥在QR码中。请注意QRCode /信息的敏感性。不久前我写了一篇博客文章netknights.it/en/the-problem-with-the-google-authenticator
–cornelinux
17年4月20日在14:46
#2 楼
工作:Authenticator实现基于时间的一次性密码(TOTP)算法。它具有以下成分:
•共享机密(字节序列)
•从当前时间派生的输入
•A签名功能
共享密钥:
共享密钥是在手机上设置帐户所需要的。您可以使用手机拍摄QR码照片,也可以手动输入密码。
输入(当前时间):
您只需从手机中获得的输入时间值,一旦获得机密,就无需与服务器进行进一步的交互。但是,确保手机的时间准确无误非常重要,因为服务器实际上将使用服务器已知的当前时间重复手机上发生的事情。
签名功能:
使用的签名功能是HMAC-SHA1。 HMAC代表基于散列的消息身份验证代码,它是一种使用安全单向散列函数(在这种情况下为SHA1)对值进行签名的算法。使用HMAC可以验证真实性-只有知道秘密的人才能为相同输入(当前时间)生成相同输出。
OTP算法:
伪代码:
original_secret = xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx
secret = BASE32_DECODE(TO_UPPERCASE(REMOVE_SPACES(original_secret)))
input = CURRENT_UNIX_TIME() / 30 // sets a constant value for 30 seconds
hmac = SHA1(secret + SHA1(secret + input)) //apply hashing
offset = hmac[len(hmac)-1] & 0x0F //Last nibble
four_bytes = hmac[offset : offset+4] //takes a subset of 4 bytes from 20 bytes
large_integer = INT(four_bytes) //Covert four bytes to integer
small_integer = large_integer % 1,000,00 //gives 6 digit code
参考:https://garbagecollected.org/2014/09/14/how-google-authenticator-works /
还请检查该github项目以执行GO:
https://github.com/robbiev/two-factor-auth/blob/master/main.go
评论
Google身份验证器还不支持HOTP吗?
–maxschlepzig
19年2月9日在13:45
#3 楼
它会根据时间在种子上工作,因此类似于RSA密钥卡的工作方式。也就是说,它们也不需要任何连接。我只是四处看看,可以在这里找到答案:https://stackoverflow.com/questions/8340495/how-rsa-tokens-作品
#4 楼
如果一个strace
守护程序是sshd
守护程序,则可以在读取用户配置文件时看到服务器如何“知道”密钥:#strace -f -v -e open /usr/sbin/sshd -p 2222 -dddd -f /etc/ssh/sshd_config 2>&1 | grep -i goog
> > [pid 2105] open("/home/myuser/.google_authenticator", O_RDONLY) = 4
> > [pid 2105] open("/home/myuser/.google_authenticator~",
> > O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_NOFOLLOW, 0400debug3:
> > mm_sshpam_respond: pam_respond returned 1 [preauth]
手机已经知道了您通过QR扫描或输入了它。
评论
这是一个很好的示例,说明了如何证明令牌没有发送到服务器,但实际上并没有解释令牌的工作方式(OP要求的是什么)
– E先生
18年8月31日在0:17
它本身并没有,但是确实解决了缺乏连接性的问题。
– james6125
19年5月10日在20:25
评论
代码不是“已发送”。它们是通过种子和柜台制成的。