java接口安全<干货篇>

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

这辈子没办法做太多事情,所以每一件都要做到精彩绝伦!

People can't do too many things in my life,so everything will be wonderful  

 

需要用到加解密工具类、自定义白名单

接口安全

1      接口安全理论

接口的安全性主要围绕TokenTimestampts)和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:

 

Token授权机制:用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID或是经过一定规则加密的字符串),并将Token:UserId以键值对的形式存放在缓存服务器(redis)中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。

 

时间戳ts超时机制:用户每次请求都带上当前时间的时间戳timestamp(ts),服务端接收到timestamp后跟当前时间进行比对,如果时间差大于一定时间(比如5分钟),则认为该请求失效,这个时间要保证足够完成本次请求的同时尽量短,可以减少缓存服务器的压力(见签名机制)。

 

签名机制:Token和时间戳加上其他请求参数(也可加上用户个人私钥:盐)进行MD5SHA-1算法(可根据情况加点盐)加密,加密后的数据为本次请求的签名sign。服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。一样的话,服务端

将该签名存放到缓存服务器(redis)中,超时时间设定为跟时间戳的超时时间一致(这就是为什么要尽量短,二者时间一致可以保证无论在timestamp规定时间内还是外本URL都只能访问一次)同一个签名只能使用一次,如果再次请求发现缓存服务器中已经存在了本次签名,则拒绝服务。

 

1.1    实现流程  

整个流程如下:

 

    1、客户端通过用户名密码登录服务器并获取Token(或token:salt

 

    2、客户端生成时间戳timestampts),并将timestamp进行AES加密,作为其中一个参数

 

    3、客户端将所有的参数,包括Tokentimestampts)按照自己的算法进行排序+salt盐,进行加密得到签名sign

 

    4、将tokentimestampts)和sign作为请求时必须携带的参数加在每个请求的URL后边(http://url/request?a=aa&b=bb&token=123&timestamp=123&sign=123123123

 

    5、服务端写一个过滤器对tokentimestampsign进行验证,只有三个参数都正确且在规定时间内,本次请求才有效(具体实现参考:1.2过滤器实现)

 

在以上三中机制的保护下,

 

如果黑客劫持了请求,并对请求中的参数进行了修改,签名就无法通过;

 

如果黑客使用已经劫持的URL进行DOS攻击,服务器则会因为缓存服务器中已经存在签名而拒绝服务,所以DOS攻击也是不可能的;

 

如果黑客隔一段时间进行一次DOS攻击(假如这个时间大于签名在缓存服务器中的缓存时长),则会因为时间戳超时而无法完成请求,这就是为什么签名的缓存时长要跟时间戳的超时时长一样。

 

如果签名算法和用户名密码都暴露了,那就只能:666 

 

1.2    过滤器实现

过滤校验流程如下:

1,判断是否是白名单;

2,判断是否是test;(用于开发中测试接口使用;上线时去掉该段代码)

3,获取请求参数requestMap,判断是否有参数;

4,遍历requestMap,校验,并将参数存放在paramMap(按字母顺序排序)中;其中的盐和sign值单独存放,用于后续的加密和比对;

5,获取sign,并判断redis中是否已经存在,存在的话,返回error

6,获取ts,判断是否可解密和是否超时;否返回:error

7,获取token,判断token是否可解密和是否于redis中的匹配,否返回:error(也可进行是否登录校验);

8,检查是否有签名值和salt盐;

9,对paramMap拼接成字符串paramString

10,对paramString+私钥(salt)进行sign加密;和请求参数sign进行比对;不一样,返回:error



本文转自 wyait 51CTO博客,原文链接:http://blog.51cto.com/wyait/1920134,如需转载请自行联系原作者
相关文章
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
218 3
|
2月前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
218 64
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
176 57
|
2月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
98 38
|
1月前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
1月前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
54 6
|
2月前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
60 2
|
2月前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
39 2
|
2月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
163 1
|
2月前
|
Java Android开发
Eclipse 创建 Java 接口
Eclipse 创建 Java 接口
44 1