数据安全
市面上,互联网产品五花八门,功能各异。但是,无论什么产品,全都做的是数据的收集、分析、展示。数据可以说是血液,他流淌于每个产品的体内,给各个业务模块输送养料,让整个产品正常运转。而今天我们要说的,就是关于测试中的数据安全问题,它们涉及到用户的隐私,重要性可见一斑。
阶段分类及举例
在这里我们按照目前最多的一种产品数据流转方式来说明和举例 —— C/S模式下的数据流转。我们最熟知的莫过于产品的注册过程,即在用户输入用户名和密码后点击提交,到用户注册成功,开始使用产品。
我们可以把数据安全要注意的点按照产品注册的工作阶段进行分类,并给出处理方案:
阶段 | 对应案例 | 处理方案 |
---|---|---|
传输前 | 用户输入用户名和密码 | 加密、增加复杂度 |
传输中 | 用户点击提交 | 通讯协议 |
传输后 | 用户注册成功 | 加密 |
传输前:加密、增加复杂度、授权
- 加密:用户的用户名和密码属于用户隐私,尤其是密码,是打开用户数据的钥匙,要妥善保管。第一,在客户端进行传输前,可以按照和服务端商定的加密方式进行数据加密,然后再进入下面传输环节。但是,需要注意客户端代码打包的加密(混淆),因为如果让不怀好意的人可以反编译出我们的客户端代码,那这个加密也形同虚设了。不过,有很多加密方式也不需要客户端和服务端事先约定,比如MD5。想破解它只能靠碰撞,几率很低,所以一般的产品可以放心使用。第二,客户端尽量不要缓存用户的密码等敏感信息,就算要缓存,也不要明文存储,要加密后存储,防止客户端数据库被黑后被人直接窃取用户信息。
- 增加复杂度:我们在上面的加密中提到了MD5,如果想破解MD5只能靠碰撞,所以想要降低被碰撞的几率,我们需要增加密码的复杂度。所以,很多产品都要求用户设置6~18位的密码,而且需要字母和数字的组合,就是为了增加密码的复杂度,降低密码被碰撞出来的几率。
- 授权:有些产品有这种功能,可以帮助用户记住用户名密码,方便用户登录。这种功能虽然方便,但是也有密码泄露的风险,毕竟会进行存储。所以,参考上面的做法,一个是加密存储,再有就是需要授权后才能取得密码。比如IPHONE输入方上的密码🔑功能,就是需要输入手机的密码才能获得的。
传输中:通讯协议
传输中其实就是通讯协议的事儿了。我们熟知的传输协议有http和https,这也是C/S模式最常用的两种协议。不过,现在http协议用的很少了,尤其是IOS系统已经在很早以前严格规定APP中不能再出现http的接口,就是因为它是有数据安全隐患的。使用过Charles或Fiddler的童鞋都知道,http的接口抓包后是可以直接看接口内容的,所以如果在传输前阶段客户端没有对敏感信息进行加密,接口数据就可以直接被中间人劫持造成信息泄露。而使用https就避免了这些,因为需要客户端的证书才能获得接口信息,大大增加了获取难度。所以,对外的接口尽量都要使用https协议,如果对性能要求特别高,但是接口没有用户信息的泄露风险,再考虑使用http。
传输后:加密、授权
加密:我们刚才说了,传输中如果使用了https,那数据是中间人很难获取到的。所以有些产品的客户端没有对用户密码进行加密就传输了,而这些密码到达服务端后也是要进行加密的。为什么?为了防止内部出现内鬼或者被人黑到我们的数据库!内鬼可以通过明文的数据来达到自我盈利的目的,被人黑也是一样。所以,所有用户的敏感信息只要是落库一定要加密,如密码、手机号、银行卡号等等。
授权:数据库中存储着用户的所有信息,其中也会包含一些图片链接或者视频等文件链接。这些也是用户的敏感信息,只能用户查阅。所以,这些文件只能是用户鉴权信息满足条件时才能查看,就算是库被人黑了,拿到了这些链接,也一样要是打不开的。更加安全的做法,就是在需要授权打开的情况下,文件还有过期时间,也就是在页面上查看时间超过比如半小时后,再次查看是需要重新授权的。
测试人需关注
数据安全,包括用户的隐私信息等,已经越来越被用户和业界所重视。相信我们大部分的测试童鞋已经知道像密码这种信息需要注意,但是上面提到的文件链接等信息也是很重要的,大家在测试过程中一定要多加提防,在需求确认阶段就要和产品讨论此事,争取把产品安全控制在最初阶段。