介绍
选用大二的web大作业,一个知识管理系统——“微知”,为基础来实现双因子用户认证模块,原本的认证方式是匹配用户名和口令,且口令在数据库中是明文存储的。
首先,先删除password字段,口令不再存储在数据库。
其次,对于散列函数,我选择了php中的md5()函数,它的返回值长度为32位。
实现加盐
在用户注册/修改口令(解释见说明)的时候随机生成一个32位的盐值(关于盐值长度的一个经验值是和hash函数的返回值长度保持一致),然后用md5()函数计算“用户输入的口令+盐值”字符串的散列值。将盐值和该散列值分别存入数据库中,字段分别是Salt和PasswordSHash(在原数据库设计的基础上新增的字段)。
认证时,在服务端通过用户输入的用户名,获取数据库中该用户对应的Salt数据,然后把Salt加到用户输入的口令值后面,再用md5()进行计算出散列值,最后将计算出的散列值和数据库中的PasswordSHash进行对比。
谷歌认证器的一次验证码
需要新增字段secretKey,用来保存每个用户(设备)的秘钥。在用户注册时,服务端随机生成一个16位的secretKey,既要在前端反馈给用户,又要存储在数据库中。用户获得到这个secretKey之后,添加到谷歌认证器中,认证器就会每隔30s提供一个6位的一次密码。
认证时,每当用户发送登录请求时,服务端会根据用户输入的用户名和口令先利用盐值和散列函数进行第一步认证。如果通过了认证,那么服务端会从数据库中获取该用户的secretKey&