API接口安全性设计以及各参数的作用

前言

对于一个暴露在互联网中的软件服务来说,网络安全一直都是一个很重的话题,时刻都要提防着各种各样的攻击,本编文章主要围绕API接口方面展开安全性思考,也是在近期学习过程中的一些总结与感悟,拿出来与大家进行分享,如有错误也欢迎各位帮助纠正!

API接口需要考虑哪些安全性问题?

1、敏感数据明文传输

2、数据传输被抓包窃取

3、数据被抓包篡改

4、重放攻击

5、DoS攻击

一般接口中包含的参数

1、token

2、timestamp

3、sign

4、nonce

5、key

接下来我们通过问题驱动,来看看这些参数存在的意义!

为什么要有Token?

我们都知道HTTP协议的特点是通信无状态,客户端与服务端的每一次通信都是陌生的,也就意味着客户端第一次登陆系统时通过用户名、密码验证通过后,也只是一次有效,一旦刷新页面就必须重新进行身份验证,这谁受得了?

于是就引入了Token机制,当客户端第一次通过用户名、密码在服务端验证通过后,服务端生成一个Token返回给客户端,之后客户端每次请求只需要带上这个Token即可表明身份。

Token的存储

当服务端缓存Token时,可以用来控制用户登录的有效期,比如在生成Token时,也把Token缓存在Redis中并设置失效时间为30分钟,那么之后客户端的每次请求都可以先从Redis中判断Token是否存在,如不存在则表示未登录或者登录已过期。

Token的安全性问题

现在Token就是访问系统的身份令牌,一旦Token被窃取也就意味着攻击者可以冒充他人身份对系统进行非法访问,所以一般都需要在HTTPS中进行传输。

timestamp

timestamp参数就是一个时间戳,主要可以用来防止DoS攻击的,当服务端收到url请求时,通过timestamp与当前服务器的时间进行比对,如果超过指定的阈值(比如1分钟),则认为本次请求无效,不过如果攻击者能够在1分钟内进行攻击的话,那timestamp的作用就只能减少攻击的时间,而不能阻止攻击行为。

如果你想到攻击者可以通过修改timestamp值来进行攻击的话,那么就需要依靠sign来解决了。

当然timestamp还可以单纯的用来记录时间等常规操作。

DoS攻击(来自百度百科的解释)

DoS是Denial of Service的简称,即拒绝服务,造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法提供正常的服务。最常见的DoS攻击有计算机网络宽带攻击和连通性攻击。

DoS攻击是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段残忍地耗尽被攻击对象的资源,目的是让目标计算机或网络无法提供正常的服务或资源访问,使目标系统服务系统停止响应甚至崩溃,而在此攻击中并不包括侵入目标服务器或目标网络设备。这些服务资源包括网络带宽,文件系统空间容量,开放的进程或者允许的连接。这种攻击会导致资源的匮乏,无论计算机的处理速度多快、内存容量多大、网络带宽的速度多快都无法避免这种攻击带来的后果。

nonce

nonce是一个在客户端生成的随机数,可以用来防止重放攻击,服务端可以规定nonce值一次性有效,服务端把客户端发来的nonce缓存到一个集合中,然后每次先从集合中判断是否存在当前发来的nonce值,如果存在则认为当前请求为重复请求,直接拒绝。

思考一个问题,服务端难道要一直维护这个nonce集合吗?这肯定不现实,所以一般会结合timestamp,你可以规定timestamp为1分钟内有效,那么自然nonce集合中保存的数据最多也就是1分钟内的客户端发来的请求。

现在我们通过nonce解决了重放攻击的问题,并且通过timestamp解决了存储nonce集合数量过大的问题。

sign

sign即签名,主要用于解决数据被篡改的问题,sign值一般通过data(业务参数)+token+key+timestamp+nonce拼接,然后再经过摘要算法(比如MD5)生成sign签名,并传递给服务端,而服务端则分别获取data、token、key、timestamp、nonce并按照约定的方式和算法也生成一个签名,再与客户端传来的sign进行比对,如果一直则表示参数没有被篡改过。

由于攻击者得不到key值,也就无法篡改参数后重新生成有效的签名。(关于为什么得不到key,请看下面对key值的分析)

当然由于data、token、key、timestamp、nonce都需要进行传输,所以也需要使用HTTPS进行传输。

key

key是一个随机数,用来作为对称加密中的密钥,主要可以对data、token、nonce进行加密,这样就可以解决数据明文传输的问题(也就是通过浏览器的F12可以看到明文数据的问题),服务端得到key后,只需要对被key加密后的数据进行解密即可。

不过key自己作为参数传递的一部分,要如何保证自己不被发现呢,这又涉及到非对称加密的问题,key可以在客户端用公钥进行加密,服务端再通过私钥进行解密即可,而公钥是可以对外暴露的(因为被公钥加密的数据,拿公钥是解不开的)。

现在所有的参数的都派上用场了,当然如果要防止数据传输过程中被抓包窃取的问题还得需要通过HTTPS来解决。

摘要算法、对称加密、非对称加密

前面文章中提到了摘要算法、对称加密、非对称加密,现在来简单做个解释:

摘要算法

摘要算法的特点就是不可逆,生成的内容是固定长度的,验证时通过同样的算法生成后进行比对验证,一般可用于数字签名。

对称加密

对称加密的特点就是通过一个密钥可以进行加密、解密,速度快、效率高,不过加密解密的双方如何安全的传递密钥就成了关键,只要有一方泄露了密钥,整个加密算法就无用了。

非对称加密

非对称加密相对对称加密来说效率偏低,但是相对安全,非对称加密使用了两个密钥,一个是对外公开的,称为公钥,一个是对内保密的,称为私钥,通过公钥加密的数据再用公钥去解密是解不开的,只有私钥才能解开,这是非对称加密的关键。

一般客户端保存公钥,服务端保存私钥,然后客户端生成随机生成对称加密的密钥,把这个密钥通过非对称加密的公钥进行加密,并传递给服务端,服务端只需要通过私钥解密,就可以得到对称加密的密钥,这样通过一次非对称加密的方式就完成了密钥的安全传递,之后双方就可以通过对称加密进行数据传输了,这样既解决了密钥传递的安全问题,又解决了非对称加密的效率问题。

HTTPS

有关HTTPS相关的内容,可以参考我的另一篇博文:通俗易懂的理解HTTPS的作用与原理

最后

希望本文对大家有所帮助,文章中如果不清楚或者错误之处也欢迎大家指出纠正。

猜你喜欢

转载自blog.csdn.net/CSDN_WYL2016/article/details/113861997
今日推荐