首页  >  问答  >  正文

java - 如何确保服务端的接口调用安全?

服务端提供各种功能接口供客户端调用,那么怎样才能确保请求是来自合法的客户端,而不是非法的请求呢?

ringa_leeringa_lee2742 天前868

全部回复(5)我来回复

  • 阿神

    阿神2017-04-18 10:57:00

    验证token,或者服务端用OAuth2框架

    回复
    0
  • 怪我咯

    怪我咯2017-04-18 10:57:00

    你是如何定义合法和非法的?在SSO框架下,有token就是横着走,如果是第三方肯定需要appid和appsecret,需要授权的话还要带上AccessToken,这样也是横着走,最简单的是写一个IP拦截器,只允许信任IP通过,但是是用于内部互相调用的高级别拦截了,一般来说对方提供了token或appsecret,基本上都算是合法的吧?

    回复
    0
  • 高洛峰

    高洛峰2017-04-18 10:57:00

    在设计API时,要保证RESTful API的安全性,主要考虑三个大方面:

    1.对受限资源的登录授权
    2.对请求做身份认证
    3.对敏感数据进行加密

    一、受限资源的登录授权
    此流程不是本文重点,不赘述,基本流程如下:

    1. 客户端提交账号信息(用户名+密码)到服务端

    2. 服务端验证成功,返回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)、仅对部分敏感数据做加密(例如账号+密码),并加入某种随机数作为加密盐,以防范数据被篡改。

    回复
    0
  • PHPz

    PHPz2017-04-18 10:57:00

    我们用的RSA加密算法,请求数据的参数均转成json然后用服务器RSA证书对json进行加密,http请求就可以了,服务端私钥解密

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:57:00

    使用oauth2或者类似的token之类的

    回复
    0
  • 取消回复