php实现双因子认证(口令加盐+谷歌认证器一次验证码)

介绍

选用大二的web大作业,一个知识管理系统——“微知”,为基础来实现双因子用户认证模块,原本的认证方式是匹配用户名和口令,且口令在数据库中是明文存储的。

首先,先删除password字段,口令不再存储在数据库。

其次,对于散列函数,我选择了php中的md5()函数,它的返回值长度为32位。

实现加盐

在用户注册/修改口令(解释见说明)的时候随机生成一个32位的盐值(关于盐值长度的一个经验值是和hash函数的返回值长度保持一致),然后用md5()函数计算“用户输入的口令+盐值”字符串的散列值。将盐值和该散列值分别存入数据库中,字段分别是Salt和PasswordSHash(在原数据库设计的基础上新增的字段)。

认证时,在服务端通过用户输入的用户名,获取数据库中该用户对应的Salt数据,然后把Salt加到用户输入的口令值后面,再用md5()进行计算出散列值,最后将计算出的散列值和数据库中的PasswordSHash进行对比。

谷歌认证器的一次验证码

需要新增字段secretKey,用来保存每个用户(设备)的秘钥。在用户注册时,服务端随机生成一个16位的secretKey,既要在前端反馈给用户,又要存储在数据库中。用户获得到这个secretKey之后,添加到谷歌认证器中,认证器就会每隔30s提供一个6位的一次密码。

认证时,每当用户发送登录请求时,服务端会根据用户输入的用户名和口令先利用盐值和散列函数进行第一步认证。如果通过了认证,那么服务端会从数据库中获取该用户的secretKey&

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值