项目总结
我接触过一个学生跑步APP项目,现在对该项目中用到的安全技术要点做一些自己的总结和整理,我对其中有些细节做了改良,小弟很菜,还望高手勿喷。
概要
首先介绍一下该项目。随着国家对大学生体育健康素质的重视,要求各个高等教育学府增加对学生体育健康素质的考核,比如要求学生每周参加一定量的体育运动。这个政策对大学老师是个考验,如何监督学生的体育运动呢?于是学生跑步APP项目诞生了,它是一款以记录学生跑步成绩为目标的软件,核心的功能是记录学生跑步信息,给学校老师打分提供数据支持。
技术要点
下面说一下安全方面的4大技术要点
-
客户端代码混淆
学生对这件事还是很敏感的,毕竟它关系到自己是否能顺利毕业,因此不少有能力的同学打起了歪主意,对客户端反编译拿到源码进行作弊。我们心里很清楚,如果代码能毫无遮拦地暴露在攻击者面前,那么再高明的防御都是徒然的,所以第一步的安全措施是:对客户端代码混淆。市面上APP软件加固产品还是有很多的,比如网易云的易盾。 -
HTTPS通讯
很早以前,客户端与服务端采用HTTP进行通讯,HTTP是明文的,所有信息毫无保留地展现在攻击者面前,为了提高攻击者破解难度,后期版本使用HTTPS通讯。 -
TOKEN验证
在识别用户身份这件事情上,不同的APP软件有不同的做法,不能说哪个做法错哪个做法正确,每一种做法都有优缺点。下面我说一下最常见的2种做法:-
用户名和密码
HTTP是无状态的,所以想要识别当前用户的身份,最简单的做法是在每一次的请求头部加入用户名和密码,服务端通过校验就能知道当前用户身份。这种做法的优点是实现简单,缺点是安全性太差,攻击者一旦截获请求头部中的信息,不但能伪造请求,而且连用户登录密码都拿到了,所以一般是不会采用这种做法的。 -
TOKEN
既然不能传递用户名和密码,那就用一个字符串来代替吧,这个字符串就是TOKEN。TOKEN的作用和用户名和密码一样,也是识别用户身份的,所不同的是,如果TOKEN被攻击者截获,用户的密码还是安全的。在大多数的设计中,TOKEN是有过期时间的,等到了过期时间,TOKEN失效,客户端需要重新获取TOKEN才能继续与服务器通信。
-
-
防止伪造成绩上传
跑步APP的核心是跑步成绩的上传,为了确保它不被伪造,我们的设计是这样的。首先说一下客户端:
- 首先客户端会从服务端获取一串随机字符串
- 然后客户端上传成绩时需要额外传2个字段,第一个字段是刚才获取的随机字符串,第二个字段是一个用于验签的MD5值,该MD5值由随机字符串与成绩中的一些核心数据计算出来的。
再说一下服务端:
- 服务端在下发随机字符串的时候会将该随机字符串放在一个字符串池子里
- 服务端接受到客户端上传的成绩时会做一些列的检查:
- 随机字符串是否在字符串池子里,不是的话就丢弃本次上传
- MD5值的计算是否正确,不正确的话就丢弃本次上传
- 检查跑步核心数据的合理性,比如跑步速度、跑步时长等,不符合就丢弃本次上传