84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
服务端提供各种功能接口供客户端调用,那么怎样才能确保请求是来自合法的客户端,而不是非法的请求呢?
ringa_lee
验证token,或者服务端用OAuth2框架
你是如何定义合法和非法的?在SSO框架下,有token就是横着走,如果是第三方肯定需要appid和appsecret,需要授权的话还要带上AccessToken,这样也是横着走,最简单的是写一个IP拦截器,只允许信任IP通过,但是是用于内部互相调用的高级别拦截了,一般来说对方提供了token或appsecret,基本上都算是合法的吧?
在设计API时,要保证RESTful API的安全性,主要考虑三个大方面:
1.对受限资源的登录授权2.对请求做身份认证3.对敏感数据进行加密
一、受限资源的登录授权此流程不是本文重点,不赘述,基本流程如下:
客户端提交账号信息(用户名+密码)到服务端
服务端验证成功,返回AccessToken给客户端存储3.访问受限资源时,客户端带入AccessToken就可访问。
二、请求认证如果不对请求进行签名认证,那么可以简单的通过fiddler等工具轻易抓包拿到数据,并进行篡改,提交,大规模批量调用,则会使系统产生大量垃圾数据,系统资源被大量消耗,甚至无法正常使用(另说,当然可以通过GateWay进行限流),因而我们需要对请求进行签名认证。
URL格式URL:schema://domain/path?query&imei×tamp&sign
参数说明签名方法sign=signature(path?query&imei×tamp&SIGN_KEY)
验证过程认证逻辑1、初始时,服务端存有各App版本的SIGN_KEY,客户端存有对应版本的SIGN_KEY2、当要发送请求之前,通过签名方法加密,得到一个sign3、发送请求的时候,连同sign一起发送给服务器端4、服务器端首先验证时间戳timestamp是否有效,比如是服务器时间戳5分钟之前的请求视为无效;5、然后取对应版本的SIGN_KEY验证sign是否合法6、为了防止重放攻击,需要检查sign是否在redis中存储,如不存在则存入redis(缓存5分钟)
如何防止数据篡改这里通过签名参数中包含原有请求的所有参数,改动任意参数,sign值都会不同,因此无法篡改。
如何防止重放攻击由于签名算法中还有imei(设备唯一Id)、timestamp参数,且签名算法为不可逆算法(如md5或sha1),因而对于正常的每个请求sign值不会重复。此时服务端可以存储5分钟的sign值,来做重放攻击时的验证过滤,超过5分钟的请求则直接被timestamp校验过滤。
总结如此便实现了请求认证,防止数据篡改,重放攻击,但是需要确保App密钥(SIGN_KEY)的安全保存,其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担。
三、敏感据加密1)、部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。2)、仅对部分敏感数据做加密(例如账号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。
我们用的RSA加密算法,请求数据的参数均转成json然后用服务器RSA证书对json进行加密,http请求就可以了,服务端私钥解密
使用oauth2或者类似的token之类的
验证token,或者服务端用OAuth2框架
你是如何定义合法和非法的?在SSO框架下,有token就是横着走,如果是第三方肯定需要appid和appsecret,需要授权的话还要带上AccessToken,这样也是横着走,最简单的是写一个IP拦截器,只允许信任IP通过,但是是用于内部互相调用的高级别拦截了,一般来说对方提供了token或appsecret,基本上都算是合法的吧?
在设计API时,要保证RESTful API的安全性,主要考虑三个大方面:
一、受限资源的登录授权
此流程不是本文重点,不赘述,基本流程如下:
客户端提交账号信息(用户名+密码)到服务端
服务端验证成功,返回AccessToken给客户端存储
3.访问受限资源时,客户端带入AccessToken就可访问。
二、请求认证
如果不对请求进行签名认证,那么可以简单的通过fiddler等工具轻易抓包拿到数据,并进行篡改,提交,大规模批量调用,则会使系统产生大量垃圾数据,系统资源被大量消耗,甚至无法正常使用(另说,当然可以通过GateWay进行限流),因而我们需要对请求进行签名认证。
URL格式
URL:schema://domain/path?query&imei×tamp&sign
参数说明
签名方法
sign=signature(path?query&imei×tamp&SIGN_KEY)
验证过程
认证逻辑
1、初始时,服务端存有各App版本的SIGN_KEY,客户端存有对应版本的SIGN_KEY
2、当要发送请求之前,通过签名方法加密,得到一个sign
3、发送请求的时候,连同sign一起发送给服务器端
4、服务器端首先验证时间戳timestamp是否有效,比如是服务器时间戳5分钟之前的请求视为无效;
5、然后取对应版本的SIGN_KEY验证sign是否合法
6、为了防止重放攻击,需要检查sign是否在redis中存储,如不存在则存入redis(缓存5分钟)
如何防止数据篡改
这里通过签名参数中包含原有请求的所有参数,改动任意参数,sign值都会不同,因此无法篡改。
如何防止重放攻击
由于签名算法中还有imei(设备唯一Id)、timestamp参数,且签名算法为不可逆算法(如md5或sha1),因而对于正常的每个请求sign值不会重复。此时服务端可以存储5分钟的sign值,来做重放攻击时的验证过滤,超过5分钟的请求则直接被timestamp校验过滤。
总结
如此便实现了请求认证,防止数据篡改,重放攻击,但是需要确保App密钥(SIGN_KEY)的安全保存,其优点是容易理解与实现,缺点是需要承担安全保存密钥和定期更新密钥的负担。
三、敏感据加密
1)、部署SSL基础设施(即HTTPS),敏感数据的传输全部基于SSL。
2)、仅对部分敏感数据做加密(例如账号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。
我们用的RSA加密算法,请求数据的参数均转成json然后用服务器RSA证书对json进行加密,http请求就可以了,服务端私钥解密
使用oauth2或者类似的token之类的