简单地说,登录就是输入用户名、密码,点击登录按钮就行了;但是到现在为止,我做登录已经两年了,如果真的这么简单,我这两年真就白活了;
其实,登录里面也有很多学问呢,做登录我们要考虑很多安全方面的问题,如:
一、防止扫密码
二、防止cookie被盗
三、防止密码被盗
每一个问题都很难做到像数学里描述一个逻辑那样的严谨,否则用户就必须符合很多条件才能上网了。
我们这里先讨论一下登录的问题,首先登录面临两个问题:
一、密码不能明文传输
二、登录使用的请求信息不能被截获,或者说即使被截获也不能使用
要解决这两个问题,下面给出几个解决方案:
一、使用https登录
优点: 只需要修改一下协议,就可以解决两个问题,做起来比较简单
缺点:
1. https 需要购买证书,是要花钱的,每年大概3000~10000不等
2. 不是所有的客户端都只是https的
3. 如果客户端的时间差的太多,也是无法访问https的
4. 证书吊销列表的下载也影响登录的速度
5. 浏览器对https有很多的安全限制,使得https和http之间的切换可能会有警告对话框
6. 。。。
二、 使用login ticket的方式
1. 提交用户名、密码之前先从服务器获取一个登录使用的票据lt,以lt为key存到mc里面吧
2. 使用username=xxx&password=md5(password+lt)<=xxx 登录
3. 根据lt查mc,如果存在,在根据username取password,做md5后比较;如果lt不存在,则该请求视为过期或重复请求优点:
1. 不需要使用https
缺点:
1. 多一次请求
2. 客户端需要做md5的代码,md5.js 压缩后也6k多了
三、 使用nonce的方式
1. 使用username=xxx&password=md5(password+nonce)&nonce=yyyyy×tamp=time_of_client_now 登录
2. 服务器端的检查过程:
if (timestamp + 5mins < server_time_now && md5(username+nonce) not in mc && 检查密码 && 将md5(username+nonce) 写入mc) 登录成功 else 登录失败
优点:
a. 一次请求就可以完成
缺点:
a. 对客户端的时间要求比较苛刻,不允许客户端时间比服务器快,不允许客户端比服务器时间慢超过5分钟该方式适用的情况: 客户端和服务器基本保证时钟同步
四、 该方式是二、三的结合
1. 提交用户名、密码之前先获取一下服务器的时间timestamp
2. 使用username=xxx&password_md5=md5(password+timestamp)×tamp=time_of_server_now 登录
3. 服务器端的检查过程同三、2.
优点:
1. 与二相比,第一次请求不需要写mc,实际登录成功之后才写mc