在各大互联网平台中对于账户的安全性不容小嘘,gmail v2ex 这些在使用的时候为了提高安全性经常会推荐绑定 google auth,用户登录或者其他操作的时候一个 token验证.

原理

 

Google Authenticator 原理如下

Google的两步验证算法源自另一种名为HMAC-Based One-Time Password的算法,简称HOTP。HOTP的工作原理如下:

客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程,此密钥不被任何第三方所知道。此外,客户端和服务器各有一个计数器C,并且事先将计数值同步。

进行验证时,客户端对密钥和计数器的组合(K,C)使用HMAC(Hash-based Message Authentication Code)算法计算一次性密码,公式如下:

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

  

上面采用了HMAC-SHA-1,当然也可以使用HMAC-MD5等。HMAC算法得出的值位数比较多,不方便用户输入,因此需要截断(Truncate)成为一组不太长十进制数(例如6位)。计算完成之后客户端计数器C计数值加1。用户将这一组十进制数输入并且提交之后,服务器端同样的计算,并且与用户提交的数值比较,如果相同,则验证通过,服务器端将计数值C增加1。如果不相同,则验证失败。

这里的一个比较有趣的问题是,如果验证失败或者客户端不小心多进行了一次生成密码操作,那么服务器和客户端之间的计数器C将不再同步,因此需要有一个重新同步(Resynchronization)的机制。这里不作具体介绍,详情可以参看RFC 4226

 

备份

 

在跟服务器绑定的过程中一般是服务端会出现 密钥K,你直接用 Google Auth app 扫码就可以绑定,服务平台会提示让你保存好这个密钥K. 这个密钥K 是你用于恢复 auth code 的. 但是当你绑定了很多验证,并且不是每次都保存了这个密钥k,这个时候你需要查看、迁移、保存某个auth code 对用的密钥时候,这个就需要用到接下来的办法.

  1. 打开 Google Authenticator 应用
  2. 点击设置(三个点,右上角),选择导出账号
  3. 如果有授权提示,按照授权操作就可以了
  4. 选择你要倒出的账号,默认情况下为 所有账户
  5. 该应用会把你所有账户按照一定数量生成1个或几个不同的QR码的图片
  6. 这里你可以选择分别截屏保存下来或者用另外一台手机的微信扫码功能,来扫这个QR码,把扫出来的内容保存下来,内容前缀为 otpauth-migration://offline?data= 
// clone google-auth OR码工具
git clone https://github.com/krissrex/google-authenticator-exporter.git 
cd google-authenticator-exporter
npm install .
  1. 上面步骤完成之后,输入 npm run start 指令,这个时候会提示输入 totpUri , 然后你就把 你保存下来的 以 otpauth-migration 开头的内容粘贴到这里,按照提示操作,选择倒出到文件还是输出到控制台
  2. 其中内容中 totpSecret 就是你倒出的账户的对应的私钥,这个要保存好!!!!

 

参考资料如下:

  1. TOTP: Time-based One-time Password Algorithm, RFC Draft, http://tools.ietf.org/id/draft-mraihi-totp-timebased-06.html
  2. HOTP: An HMAC-Based One-Time Password Algorithm, RFC 4226, http://tools.ietf.org/html/rfc4226
  3. Google Authenticator project, http://code.google.com/p/google-authenticator/