3-2 用户登陆系统的流程说明
Emos在线办公系统有两种登陆的方式,一种是微信小程序扫描二维码登陆,这个功能已经实现了,内置到项目中;另一种是账户密码的登陆方式,我们写程序实现的就是该功能。
![]() |
|---|
我们动手写用户登陆的代码之前,必须要先了解其中的具体流程,所以我画了下面这幅时序图,咱们对照时序图写程序,思路更加清晰。
![]() |
|---|
上面时序图中,后端项目最终返回给前端的R对象中包含两种数据,一个是布尔值代表登陆结果,另一个是该用户的拥有的权限列表。因为在前端需要根据权限判断用户是否可以看到某些栏目和执行某些操作。
用户密码的加密与解密
在tb_user数据表中保存的用户信息里面,password字段的值是经过加密存储的,而且不存在全局密钥。我使用每个用户的username作为密钥,对password字段加密。也就是说100万条用户记录,就存在100万个密钥。这对黑客采用穷举方法破解密钥来说,计算量超级大。如果每个密钥中采用加盐的做法,那么黑客估计自杀的心都有了。大家可以自己设计加盐的做法,例如对用户名取MD5值,然后取最后六位字符和用户名拼接在一起,当做密钥。
说回到加密算法,我这里采用的是IBM开发的AES算法。这种对称加密算法在加密和解密数据的时候,使用相同的密钥。也就是说密钥既可以用来加密数据,也可以解密数据。关于AES算法的优点我这里不展开说明了,大家可以自己百度查阅资料。MySQL数据库提供了内置的DES加密和解密的函数,我们只需要调用即可。加密的函数叫做AES_ENCRPT(),解密的函数叫做AES_DECRPT(),下面咱们结合具体案例了解这两个函数的用法。
SELECT AES_ENCRYPT("abc123456","HelloWorld");
因为加密后的字节数据在UTF8字符集中会出现乱码,所以我把字节数据转换成16进制数据(HEX),就不会出现乱码了。
SELECT HEX(AES_ENCRYPT("abc123456","HelloWorld"));
解密的时候,我们需要先把16进制数据转换成字节,然后进行解密。
SELECT AES_DECRYPT(UNHEX("F943968B28B2D93E2DC48CD72014FE1A"),"HelloWorld")


