个人总结接口安全需要注意以下几点
一、避免明文:
- post —— post、get等请求方式只是语义不同,本质都是基于TCP/IP协议的http数据传输,在安全性上区别很小,在开发者眼里等于是没有区别。
- get在请求地址上明文拼接参数,请求会被浏览器记录,数据会被缓存;
- post参数不会被浏览器记录或缓存,也不会被服务器日志记录;
cookie —— cookie主要作用就是会话保持,它本身其实并不是什么安全机制,要保证cookie安全仍然需要配合其它安全机制,如设置过期时间、数据加密。
编码 —— 使用类似base64等编码的自定义编码方式,或者用通用的加密算法,如md5,DES,AES,根据安全性需求自己决定使用什么算法和编码。
二、防止信息截取,伪造用户行为,篡改
- 前端和后端以约定的算法加密参数拼接在一起字符串,后端拿到加密串后解密验证参数,验证一致才接受请求。
- 这种方式存在app被反编译算法泄露的风险,也存在开发者泄露算法的风险。
- 登录的时候后端生成token并返回给前端,token使用公钥、uid、时间戳等来计算后生成,请求接口时再带上token。
- 使用非对称加密算法,前端数据全部使用公钥加密,后端使用私钥来解密和验证。需要注意的是:后端私钥要妥善保管。
- 这种方式需要让用户隔一段时间自动退出(可以通过设置token时效实现),使token只在用户人为登录登出之间有用。token可以放进redis缓存等一段时间自动失效,也可以存在数据库,但需要在登录登出时修改数据库使token失效或删除token。
三、防止中间人攻击
对于开发者来说避免MITM攻击最有效的方式就是使用https接口。https本质也是非对称加密,是在http协议上添加了SSL协议。
- 需要先向服务器发起一个无保护的请求,来初始化SSL,因为第一次连接https服务器要先把证书和签名发给客户端。
- https首次连接时比较慢,因为SSl协议包含两部分,握手协议和记录协议,握手协议部分需要使用非对称算法计算出当前通信的秘钥。这个秘钥是当前通信的对称加密秘钥。
四、防内鬼
由内部人员开发固定写死的加密方案都存在被内部人员破解的风险,当然可以引入可靠第三方的黑箱算法,而作为普通开发者最实用的方式就是在算法签名字符串中引入随机字符串。
使用时间戳或者随机数参与生成加密签名,并保存在数据库或者redis,配合使用数据库权限和Linux用户权限,开发人员只能修改算法,数据库只有有权限的人能获取。结合非对称加密、随机串、数据库和Linux用户权限,已经可以很好地保证安全了,可以既防外又防内。
五、安全登录
接口安全的第一道也是最重要的一道关便是安全登录,如果用户使用网站或者app登录的过程中泄露了密码,那什么安全机制都是空谈了。
对于登录的安全性,银行网站和app的实现方式最值得参考,主要有如下方式:
- 短信验证码
- 密码错误次数限制
- 异地登录、更换设备登录时短信通知
- 使用https接口
- 密码输入使用自定义的键盘
- 登录参数使用非对称加密
- 人脸识别