API接⼝设计之token、timestamp、sign具体实现
内容来源于:
⼀、token 简介
Token:访问令牌access token, ⽤于接⼝中, ⽤于标识接⼝调⽤者的⾝份、凭证,减少⽤户名和密码的传输次数。⼀般情况下客户端(接⼝调⽤⽅)需要先向服务器端申请⼀个接⼝调⽤的账号,服务器会给出⼀个appId和⼀个key, key⽤于参数签名使⽤,注意key保存到客户端,需要做⼀些安全处理,防⽌泄露。
Token的值⼀般是UUID,服务端⽣成Token后需要将token做为key,将⼀些和token关联的信息作为value保存到缓存服务器中(redis),当⼀个请求过来后,服务器就去缓存服务器中查询这个Token是否存在,存在则调⽤接⼝,不存在返回接⼝错误,⼀般通过或者过滤器来实现,Token分为两种:
API Token(接⼝令牌): ⽤于访问不需要⽤户登录的接⼝,如登录、注册、⼀些基本数据的获取等。获取接⼝令牌需要拿appId、timestamp和sign来换,sign=加密(timestamp+key)
USER Token(⽤户令牌): ⽤于访问需要⽤户登录之后的接⼝,如:获取我的基本信息、保存、修改、删除等操作。获取⽤户令牌需要拿⽤户名和密码来换
关于Token的时效性:token可以是⼀次性的、也可以在⼀段时间范围内是有效的,具体使⽤哪种看业务需要。
⼀般情况下接⼝最好使⽤https协议,如果使⽤http协议,Token机制只是⼀种减少被⿊的可能性,其实只能防君⼦不能防⼩⼈。
⼀般token、timestamp和sign 三个参数会在接⼝中会同时作为参数传递,每个参数都有各⾃的⽤途。
⼆、timestamp 简介
timestamp: 时间戳,是客户端调⽤接⼝时对应的当前时间戳,时间戳⽤于防⽌DoS攻击。当⿊客劫持了请求的url去DoS攻击,每次调⽤接⼝时接⼝都会判断服务器当前系统时间和接⼝中传的的timestamp的差值,如果这个差值超过某个设置的时间(假如5分钟),那么这个请求将被拦截掉,如果在设置的超时时间范围内,是不能阻⽌DoS攻击的。timestamp机制只能减轻DoS攻击的时间,缩短攻击时间。如果⿊客修改了时间戳的值可通过sign签名机制来处理。
DoS
DoS是Denial of Service的简称,即拒绝服务,造成DoS的攻击⾏为被称为DoS攻击,其⽬的是使计算机或⽹络⽆法提供正常的服务。最常见的DoS攻击有计算机⽹络带宽攻击和连通性攻击。DoS攻击是
指故意的攻击⽹络协议实现的缺陷或直接通过野蛮⼿段残忍地耗尽被攻击对象的资源,⽬的是让⽬标计算机或⽹络⽆法提供正常的服务或资源访问,使⽬标系统服务系统停⽌响应甚⾄崩溃,⽽在此攻击中并不包括侵⼊⽬标服务器或⽬标⽹络设备。这些服务资源包括⽹络带宽,⽂件系统空间容量,开放的进程或者允许的连接。这种攻击会导致资源的匮乏,⽆论计算机的处理速度多快、内存容量多⼤、⽹络带宽的速度多快都⽆法避免这种攻击带来的后果。
Pingflood: 该攻击在短时间内向⽬的主机发送⼤量ping包,造成⽹络堵塞或主机资源耗尽。
Synflood: 该攻击以多个随机的源主机地址向⽬的主机发送SYN包,⽽在收到⽬的主机的SYN ACK后并不回应,这样,⽬的主机就为这些源主机建⽴了⼤量的连接队列,⽽且由于没有收到ACK⼀直维护着这
些队列,造成了资源的⼤量消耗⽽不能向正常请求提供服务。
Smurf:该攻击向⼀个⼦⽹的⼴播地址发⼀个带有特定请求(如ICMP回应请求)的包,并且将源地址伪装成想要攻击的主机地址。⼦⽹上所有主机都回应⼴播包请求⽽向被攻击主机发包,使该主机受到攻击。
Land-based:攻击者将⼀个包的源地址和⽬的地址都设置为⽬标主机的地址,然后将该包通过IP欺骗
的⽅式发送给被攻击主机,这种包可以造成被攻击主机因试图与⾃⼰建⽴连接⽽陷⼊死循环,从⽽很⼤程度地降低了系统性能。
Ping of Death:根据TCP/IP的规范,⼀个包的长度最⼤为65536字节。尽管⼀个包的长度不能超过65536字节,但是⼀个包分成的多个⽚段的叠加却能做到。当⼀个主机收到了长度⼤于65536字节的包时,就是受到了Ping of Death攻击,该攻击会造成主机的宕机。
Teardrop:IP数据包在⽹络传递时,数据包可以分成更⼩的⽚段。攻击者可以通过发送两段(或者更多)数据包来实现TearDrop攻击。第⼀个包的偏移量为0,长度为N,第⼆个包的偏移量⼩于N。为了合并这些数据段,TCP/IP堆栈会分配超乎寻常的巨⼤资源,从⽽造成系统资源的缺乏甚⾄机器的重新启动。
PingSweep:使⽤ICMP Echo轮询多个主机。
三、sign 简介
nonce:随机值,是客户端随机⽣成的值,作为参数传递过来,随机值的⽬的是增加sign签名的多变性。随机值⼀般是数字和字母的组合,6位长度,随机值的组成和长度没有固定规则。sign: ⼀般⽤于参数签名,防⽌参数被⾮法篡改,最常见的是修改⾦额等重要敏感参数, sign 的值⼀般是将所有⾮空
参数按照升续排序然后+token+key+timestamp+nonce(随机数)拼接在⼀起,然后使⽤某种加密算法进⾏加密,作为接
⼝中的⼀个参数sign来传递,也可以将sign放到请求头中。接⼝在⽹络传输过程中如果被⿊客挟持,并修改其中的参数值,然后再继续调⽤接⼝,虽然参数的值被修改了,但是因为⿊客不知道sign是如何计算出来的,不知道sign都有哪些值构成,不知道以怎样的顺序拼接在⼀起的,最重要的是不知道签名字符串中的key是什么,所以⿊客可以篡改参数的值,但没法修改sign的值,当服务器调⽤接⼝前会按照sign的规则重新计算出sign的值然后和接⼝传递的sign参数的值做⽐较,如果相等表⽰参数值没有被篡改,如果不等,表⽰参数被⾮法篡改了,就不执⾏接⼝了。
四、防⽌重复提交
对于⼀些重要的操作需要防⽌客户端重复提交的(如⾮幂等性重要操作),具体办法是当请求第⼀次提交时将sign作为key保存到redis,并设置超时时间,超时时间和Timestamp中设置的差值相同。当同⼀个请求第⼆次访问时会先检测redis是否存在该sign,如果存在则证明重复提交了,接⼝就不再继续调⽤了。如果sign在缓存服务器中因过期时间到了,⽽被删除了,此时当这个url再次请求服务器时,因token的过期时间和sign的过期时间⼀直,sign过期也意味着token过期,那样同样的url再访问服务器会因token错误会被拦截掉,这就是为什么sign和token 的过期时间要保持⼀致的原因。拒绝重复调⽤机制确保URL被别⼈截获了也⽆法使⽤(如抓取数据)。
影视资源站采集api接口数据
对于哪些接⼝需要防⽌重复提交可以⾃定义个注解来标记。
注意:
所有的安全措施都⽤上的话有时候难免太过复杂,在实际项⽬中需要根据⾃⾝情况作出裁剪,⽐如可以只使⽤签名机制就可以保证信息不会被篡改,或者定向提供服务的时候只⽤Token机制就可以了。如何裁剪,全看项⽬实际情况和对接⼝安全性的要求。
五、使⽤流程
1. 接⼝调⽤⽅(客户端)向接⼝提供⽅(服务器)申请接⼝调⽤账号,申请成功后,接⼝提供⽅会给接⼝调⽤⽅⼀个appId和⼀个key参数
2. 客户端携带参数appId、timestamp、sign去调⽤服务器端的API token,其中sign=加密(appId + timestamp + key)
3. 客户端拿着api_token 去访问不需要登录就能访问的接⼝
4. 当访问⽤户需要登录的接⼝时,客户端跳转到登录页⾯,通过⽤户名和密码调⽤登录接⼝,登录接⼝会返回⼀个usertoken, 客户端拿
着usertoken 去访问需要登录才能访问的接⼝
sign的作⽤是防⽌参数被篡改,客户端调⽤服务端时需要传递sign参数,服务器响应客户端时也可以返回⼀个sign⽤于客户度校验返回的值是否被⾮法篡改了。客户端传的sign和服务器端响应的sign算法可能会不同。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。