iOS登录token与请求安全设计

在介绍之前,我们应该首先了解一下密码学的知识,可以点击这里查看

在开发过程中我们会面临密码,重要信息传输,以及如何判断当前用户是否重复登录的问题。在这里首先我们说一下判断当前用户是否重复登录的问题 如果是即时通信类应用,一般都会以长连接的方式接受发送数据,因为长连接的存在,可以通过“心跳包”来检测用户是否在线以及是否重复登录,而一般的应用都不会维持长连接,而是采用另一种方式,token判断的方式

token是什么?

token 相当于登录令牌, 用来判断当前用户的登录状态,它是一个字符串/大整数,只需要保证唯一性.是服务器根据用户的信息来生成的用于标识用户身份的值

怎么实现?

当用户首次登录成功之后, 服务器端就会生成一个 token 值,这个token值会保存在服务器的数据库中,同时把这个值返回给客户端

当客户端拿到值之后需要将其进行持久化存储,保存在沙盒中,同时把它当做公共参数传递,之后客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器

服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值做对比

如果两个 token 值相同 :说明用户登录成功过,当前用户处于登录状态 如果没有这个 token 值, 没有登录成功 如果 token 值不同,说明原来的登录信息已经失效,让用户重新登录

对于允许多态设备同时登陆的需求,我们同样可以设置多个token值,根据登录的数量 可以判断最大支持多少个设备同时登录 需要注意的是,在设置token时,我们可以设置它的时效性,如果 app 是新闻类/游戏类/聊天类等需要长时间用户粘性的. 一般可以设置1年的有效时间,如果 app 是 支付类/银行类的. 一般token只得有效时间比较短: 15分钟左右即可

请求安全的设计

如果使用https的方式,安全性还是有足够的保障(对于https的原理,这篇文章写得很棒),如果使用http对于一些重要数据信息则需要更多的保护。对于请求的安全,看到过一些文章总感觉有很大的问题 以登录传输密码为例,看到过有MD5加密(不论加盐还是时间戳)的方式传输,如果是这样,那密码岂不是传到服务器端后无法解密,还原不出密码了?还有的方式是,第一登录发起请求,服务器返回公钥给客户端,如果在此过程服务器返回的数据被劫持,劫持者把自己的公钥发送给了客户端,客户端此时再把账户与密码发给服务器,劫持者这个时候不是可以轻松地获取到客户端的账户与密码?

服务器与客户端进行通信,只要保证通信是安全的就可以,因为开发过程必然要与后台人员交流,基于此,这里我们可以使用AES对称加密的方式,传输账户与密码。

实现起来非常的简单,首先我们与后台人员协商合适的密钥与加密的配置,然后传输的时候使用密钥将账户与密码加密传输,服务器通过约定的密钥解密即可

虽然简单却有以下好处:

  • 安全性高,密钥的设置位数足够大的情况下,想要破解密钥几乎不可能
  • 请求没有繁琐的步骤
  • 操作简单
  • 可以蒋明文账户与密码传给服务器

而在服务保存密码的过程中可以使用Base64的方式存储,同样服务器可以返回一个sessionID用来充当userID 这样的方式在支付过程中同样可以以此来加密金额,防止恶意修改

以上只是个人见解,如果问题或者不对的地方希望能够提出指正~