前言最近对站点的登录页面进行了重构。之前安全问题比较大,基本处于裸奔状态。在此,我将过程记录下来。先说一下网站的后台语言是php,为什么要用php,因为php是世界上最好的语言,也许吧,但是最大的原因是因为我的网站是托管在虚拟主机上的,目前,几乎所有的厂商的虚拟主机只支持php,但是本文涉及的php代码很简单,和js没什么区别。本次规划了三种登录方式,密码登录、手机验证码登录、第三方登录。让我们一一看看。界面登录界面一般比较简单,无非就是几个输入框。对于笔者这样的一线实体码农来说,只是三倍二倍二分的事情。看看最后的效果:ElementUI和厚QQ是不是空间风混在一起了?行为验证现在大多数网站在登录前通常都会进行人机验证。从最早的输入各种字符验证码,到现在越来越流行的滑动拼图验证、文本选择验证、无感验证等,阿里云、网易、腾讯等大公司都提供行为验证服务。行为验证一般是通过前端和后端的配合进行验证。简单的前端验证并不安全,可以绕过。因此,前端验证通过后,会生成token等token传给后端,由后端调用服务商的相应接口进行验证。行为验证的原理可能涉及到机器学习,这超出了作者的能力范围。不过,作为用户,服务商对于具体的使用方法一般都有详细的示例和示例代码,这里就不赘述了。密码登录密码登录是最传统、最古老的登录方式。注册时将账号密码保存在数据库中,登录时再进行比对,基本原理是不能明文传输或存储。具体实现上,首先设置密码的要求。暂定长度为八到十六个字符。至少需要包含大小写字母和数字,可以包含一些特殊字符:$@$!%*#_~?&,前后端都要验证。如果网站支持https,就不用考虑传输问题,但是我的虚拟主机不支持,所以需要手动加密传输。后台收到密码并解密后,进行不可逆的加密存储。密码规则校验可以直接通过正则表达式来校验。上述密码规则的正则表达式之一实现为:/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9$@!.%*#_~?&]{8,16}$/,前三个括号都是(?=p)的模式,p是子模式,?=用来匹配p模式前的位置,整体意思是匹配任意字符加小写字母,任意字符加大写字母,任意字符加数字开头八位以上包含数字和大小写字母,其中.*是必须的,否则上面的正则表达式不会匹配任何字符,因为一个字符串不可能同时以大小写字母和数字开头。加密传输常用的加密方式有几种:MD5、对称加密、非对称加密。在这种场景下,MD5是不适合的,因为它对字符进行了不可逆的编码,传输到服务器时无法解码。使用起来不安全,很多人认为它不是加密算法;在对称加密的情况下,加密和解密使用的是同一个密钥,也就是说这个密钥也必须内置在前端代码中,所以只要打开源码就可以看到,不安全,只能选择非对称加密。非对称加密有两个密钥,公钥和私钥。选择一个进行加密和解密。其中一个加密数据只能用另一个密钥加密。这样在前端可以使用公钥加密,后端可以使用私钥解密,没有私钥即使找到了公钥也没有用。目前,最广为人知和最重要的是RSA加密算法。更多内容可参考阮大神的文章:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html。RSA加密安全的代价之一就是速度慢,它比对称加密慢很多,所以一般和对称加密结合使用,比如HTTPS协议。传输的信息使用对称加密算法进行加密,对称加密的秘钥使用非对称加密。加密传输的加密方法。另外,RSA加密后的数据大小不能超过秘钥的长度。例如,如果您的密钥长度为1024位,则加密数据最大不能超过1024/8=128字节。首先我们根据登录场景做一个简单的计算。利用上面百科上的utf8编码转换表,写了一个简单的计算字符字节数的方法如下:functionstrLen(str){letlen=0for(leti=0;i