java接口安全<干货篇>

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

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

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,如需转载请自行联系原作者
相关文章
|
3月前
|
安全 Java API
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
70 2
|
3月前
|
JSON Java 数据库连接
|
10月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
491 3
|
6月前
|
机器学习/深度学习 人工智能 NoSQL
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
随着大模型的越来越盛行,现在很多企业开始接入大模型的接口,今天我从java开发角度来写一个demo的示例,用于接入DeepSeek大模型,国内的大模型有很多的接入渠道,今天主要介绍下阿里云的百炼模型,因为这个模型是免费的,只要注册一个账户,就会免费送百万的token进行学习,今天就从一个简单的可以执行的示例开始进行介绍,希望可以分享给各位正在学习的同学们。
1088 3
JAVA接入DeepSeek大模型接口开发---阿里云的百炼模型
|
5月前
|
Java 编译器 API
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
114 0
|
5月前
|
Java
java中一个接口A,以及一个实现它的类B,一个A类型的引用对象作为一个方法的参数,这个参数的类型可以是B的类型吗?
本文探讨了面向对象编程中接口与实现类的关系,以及里氏替换原则(LSP)的应用。通过示例代码展示了如何利用多态性将实现类的对象传递给接口类型的参数,满足LSP的要求。LSP确保子类能无缝替换父类或接口,不改变程序行为。接口定义了行为规范,实现类遵循此规范,从而保证了多态性和代码的可维护性。总结来说,接口与实现类的关系天然符合LSP,体现了多态性的核心思想。
112 0
|
7月前
|
人工智能 监控 安全
Java智慧工地(源码):数字化管理提升施工安全与质量
随着科技的发展,智慧工地已成为建筑行业转型升级的重要手段。依托智能感知设备和云物互联技术,智慧工地为工程管理带来了革命性的变革,实现了项目管理的简单化、远程化和智能化。
173 5
|
7月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
1236 5
|
10月前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
604 64

热门文章

最新文章