双因子认证系统登录模块 口令+盐 谷歌身份验证器 SpringBoot+MybatisPlus

项目源码:https://github.com/applewld/google-authenticator-demo

一. 编程思路(实验原理)

加盐哈希:存放帐号的数据库经常成为入侵的目标,所以你必须做点什么来保护密码,以防网站被攻破时发生危险。最好的办法就是对密码进行加盐哈希。在密码中混入一段“随机”的字符串再进行哈希加密,这个被字符串被称作盐值。这使得同一个密码每次都被加密为完全不同的字符串。为了校验密码是否正确,我们需要储存盐值。通常和密码哈希值一起存放在账户数据库中,或者直接存为哈希字符串的一部分。

google身份验证器:客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程,此密钥不被任何第三方所知道。此外,客户端和服务器各有一个计数器C,并且事先将计数值同步。进行验证时,客户端对密钥和计数器的组合(K,C)使用HMAC(Hash-based Message Authentication Code)算法计算一次性密码,公式如下:

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

二. 实验总结

1. 核心代码分析(附关键注释

为了方便理解,按照业务流程来分析代码

1.首先用户注册账号,用户输入的注册账号和密码传到后端

对原始密码进行加盐哈希加密原始密码,同时随机生成一个用于google身份验证的密钥。后台数据库保存加密后的密码,秘密盐值,以及用于google身份验证的密钥

以下代码用于随机生成密钥

2.客户端和服务器各有一个计数器C,微信小程序二次验证码扫描二维码, 将计数值同步

3.当用户进入登录页,输入账号,密码登录后,系统先对用户输入的密码进行初次验证(双因子认证,第一次认证)

以下代码是初次验证

4.初次密码认证通过之后,系统会弹出弹框,要求输入口令,这个口令就是小程序中谷歌身份验证器产生的随机code(双因子认证,第二次认证)

2. 实验结果

运行程序,程序运行正常,截图如下:

1.以下是系统注册页

2.  输入账号密码,点击注册

 

  1. 微信打开二次验证码小程序扫描二维码

4.点击弹框上的关闭按钮,关闭弹框,系统进入登录页

5.输入账号密码,点击登录,弹出提示弹框

6.输入小程序中的令牌,登录成功

7.关闭弹窗,进入系统首页

猜你喜欢

转载自blog.csdn.net/applewld/article/details/85766820