摘要:Google Authenticator(谷歌身份验证器),是谷歌公司推出的一款动态令牌工具,解决账户使用时遭到的一些不安全的操作进行的“二次验证”,认证器基于RFC文档中的HOTP/TOTP算法实现 ,是一种从共享秘钥和时间或次数一次性令牌的算法。在工作中可以通过认证器方式对账户有更好的保护,但是在查阅一些资料发现适合我这样的小白文章真的很少,针对于C#的文章就更加少了,本文主要是对C#如何使用Google Authenticator(谷歌身份验证器)进行探讨,有不足之处还请见谅。
Google Authenticator(谷歌身份验证器)
什么是认证器?怎么对接?
Google Authenticator(谷歌身份验证器)是微软推出的一个动态密令工具,它有两种密令模式。分别是“TOTP 基于时间”、“HOTP 基于计数器”,通过手机上 简单的设置就可以设定自己独一的动态密令, 那么我们怎么将我们的程序和认证器进行对接呢?其实谷歌认证器并不是需要我们对接这个工具的API而是通过算法来决定,谷歌使用使用HMAC算法生成密令,通过基于次数或者基于时间两个模板进行计算,因此在程序中只需要使用相同的算法即可与之匹配。
TOTP 基于时间
- HMAC算法使用固定为HmacSHA1
- 更新时长固定为30秒
- APP端输入数据维度只有两个:账户名称(自己随意填写方便自己查看)和base32格式的key
HOTP 基于计数器
基于计数器模式是根据一个共享秘钥K和一个C计数器进行算法计算
认证器安装
效果图
![](https://i-blog.csdnimg.cn/blog_migrate/5464f2f704b9981d7391ec1812c3f9e2.gif)
容
案例
控制台
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace GoogleAuthenticator 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 long duration = 30; 13 string key = "xeon997@foxmail.com"; 14 GoogleAuthenticator authenticator = new GoogleAuthenticator(duration, key); 15 var mobileKey = authenticator.GetMobilePhoneKey(); 16 17 while (true) 18 { 19 20 Console.WriteLine("手机端秘钥为:" + mobileKey); 21 22 var code = authenticator.GenerateCode(); 23 Console.WriteLine("动态验证码为:" + code); 24 25 Console.WriteLine("刷新倒计时:" + authenticator.EXPIRE_SECONDS); 26 27 System.Threading.Thread.Sleep(1000); 28 Console.Clear(); 29 } 30 } 31 } 32 }
认证器类
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 using GoogleAuthorization; 2 using System; 3 using System.Security.Cryptography; 4 using System.Text; 5 namespace GoogleAuthenticator 6 { 7 public class GoogleAuthenticator 8 { 9 /// <summary> 10 /// 初始化验证码生成规则 11 /// </summary> 12 /// &l