谷歌身份验证器如何工作?

信息安全 验证 密码 密码学 谷歌 一次性密码
2021-08-27 22:00:58

Google Authenticator 是用于 2Step 验证的 SMS 的替代方案,它在 Android 上安装一个应用程序来发送代码。

它无需任何连接即可工作;它甚至可以在平面模式下工作。这是我不明白的。它怎么可能在没有连接的情况下工作?手机和服务器如何同步才能知道那一刻哪个代码有效?

4个回答

Google Authenticator 支持生成一次性密码的HOTPTOTP算法。

使用 HOTP,服务器和客户端共享一个秘密值和一个计数器,用于在双方独立计算一次性密码。每当生成和使用密码时,计数器都会在两侧递增,从而使服务器和客户端保持同步。

TOTP 本质上使用与 HOTP 相同的算法,但有一个主要区别。TOTP 中使用的计数器被当前时间替换。只要系统时间保持不变,客户端和服务器就会保持同步。这可以通过使用网络时间协议来完成。

必须在某个时间点将密钥(以及在 HOTP 情况下的计数器)传达给服务器和客户端。对于 Google Authenticator,这是以 QRCode 编码 URI 的形式完成的。有关详细信息,请参阅:KeyUriFormat

在职的:

Authenticator 实现基于时间的一次性密码 (TOTP) 算法。它有以下成分:

• 共享秘密(字节序列)

• 从当前时间派生的输入

• 签名功能

共享密钥: 共享密钥是您在手机上设置帐户所需的信息。您可以使用手机拍摄 QR 码的照片,也可以手动输入密码。

输入(当前时间): 您只需从手机中获取的输入时间值,一旦您获得秘密,就无需与服务器进一步交互。但是,重要的是您的手机时间准确,因为服务器将使用服务器已知的当前时间基本上重复您手机上发生的事情。

签名函数: 使用的签名函数是 HMAC-SHA1。HMAC 代表基于哈希的消息验证码,它是一种使用安全单向哈希函数(在本例中为 SHA1)对值进行签名的算法。使用 HMAC 可以让我们验证真实性——只有知道秘密的人才能为相同的输入(当前时间)生成相同的输出。

一次性密码算法:

伪代码:

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

它会根据时间在种子上工作,因此它类似于 RSA 密钥卡的工作方式。即它们也不需要任何连接。

我刚刚环顾四周,在这里得到了回答:https ://stackoverflow.com/questions/8340495/how-rsa-tokens-works

如果一个stracesshd守护进程,则可以看到服务器在读取用户配置文件时如何“知道”密钥:

#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 扫描或输入。