在介绍之前,我们应该首先了解一下密码学的知识,可以点击这里查看
在开发过程中我们会面临密码,重要信息传输,以及如何判断当前用户是否重复登录的问题。在这里首先我们说一下判断当前用户是否重复登录的问题 如果是即时通信类应用,一般都会以长连接的方式接受发送数据,因为长连接的存在,可以通过“心跳包”来检测用户是否在线以及是否重复登录,而一般的应用都不会维持长连接,而是采用另一种方式,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
这样的方式在支付过程中同样可以以此来加密金额,防止恶意修改
以上只是个人见解,如果问题或者不对的地方希望能够提出指正~