登录解决方案

简单地说,登录就是输入用户名、密码,点击登录按钮就行了;但是到现在为止,我做登录已经两年了,如果真的这么简单,我这两年真就白活了;
其实,登录里面也有很多学问呢,做登录我们要考虑很多安全方面的问题,如:
一、防止扫密码
二、防止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)&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&timestamp=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)&timestamp=time_of_server_now 登录
   3. 服务器端的检查过程同三、2.

  
优点:
1. 与二相比,第一次请求不需要写mc,实际登录成功之后才写mc

        


留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据