服务老是被攻击?教你设计一套安全的接口访问策略,非常稳健!

Java接口调用安全实战:签名机制与重放攻击防御指南 在分布式系统与微服务架构中,接口调用是系统间通信的核心技术,其安全性直接关系到业务数据的完整性与可靠性。接口签名的原理在于通过哈希算法(如SHA-256或HMAC-SHA256)与密钥结合,为每个请求生成唯一身份标识,确保传输过程的不可篡改与调用方身份可信。这项技术的核心价值在于构建可信的数据交换通道,防止数据在传输中被恶意篡改或伪造。在实际应用场景中,无论是支付网关对接、第三方服务集成,还是内部系统交互,健全的签名机制都是保障接口安全的第一道防线。本文聚焦于Java后端开发中的重放攻击防御实践,深入解析如 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

c5ab194f5094f504b5669934fd414f10.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7121168651222253599

0fb9d3338e75c0e643a020fc51be3b9b.jpeg


最近接手了一个项目,兴致勃勃的准备大干一场,结果一顿渗透测试下来我都快傻了。什么防重放攻击,请求体篡改,越权攻击,都整上来了,好嘛,我都不清楚这个项目这半年是怎么度过的。

6d1572addb2e79988e557834625f1524.jpeg

不知道大家公司对接口安全这块是怎么考量的,但是对于面向公网提供服务的产品来说,这个可以说是很致命的了。那么,该如何设计一套比较安全的接口访问策略呢?

一、Token与签名

一般客户端和服务端的设计过程中,大部分分为有状态和无状态接口。一般用户登录状态下,判断用户是否有权限或者能否请求接口,都是根据用户登录成功后,服务端授予的token进行控制的。但并不是说有了token,请求就是安全的,那么万一token泄露了怎么办呢?谁都可以调用我的服务了吗?

就比如去银行取钱,需要用到银行卡。但不能因为你不小心把银行卡弄丢了,捡到的人就可以拿着你的银行卡去银行办理业务了。他们还需要对你的身份进行验证,你也要知道银行卡密码。

所以token只是用户权限以及会话的凭证,除了会话的凭证,我们也要校验请求的合法性,以防止token泄露而导致客户的损失。

而签名摘要计算则是用来进行请求合法性校验。经常同学们会把这两种搞混。以为使用token就是安全的。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、签名计算设计

签名摘要的计算一般分为签名值和签名的key,signature生成方式如下:

signature = Base64(HMAC-SHA256(LOWER(MD5(key)), StringToSign))
2.1 签名字符串的设计

设计签名字符串时,我们要想好,我们要针对不同的攻击策略,设计什么样的请求头部

常用的签名字符串设计如下:

StringToSign =  Content-MD5 + "\n"
               + CanonicalizedHeaders

CanonicalizedHeaders构建方法如下:

1.以service为前缀的的Headers,但是不包括service-signature,如下

  • service-nonce:客户端生成32位随机字符串,所有客户端5分钟内不能重复,重复时平台回复nonce重复,客户端需要重新请求。

  • service-date:请求生成的时间,与服务器本地时间差超过5分钟,认为鉴权失败。

  • service-session-id:客户端会话id,用于本次登录后的所有请求会话标识。

  • service-client:客户端信息,包括客户端类型、客户端版本、操作系统等。

2.Header名称全部小写,值前后应不包含空格

3.Header的名称和值之间用“:”相隔,组成一个完整的header

4.根据header名称的字符顺序,将header从小到大进行字典排序,每个header之后跟一个“\n”

StringToSign生成示例

eB5eJF1ptWaXm4bijSPyxw==\n
service-client:ewogICAgImRhdGEiOiB7CiAgICAgICAgImNsaWVudFR5cGUiOiAieHh4IiwKICAgICAgICAiY2xpZW50VmVyc2lvbiI6ICIzLjAiCiAgICB9Cn0=\n
service-date:2022-07-22T14:43:07Z\n
service-nonce:d36e316282959a9ed4c89851497a717f\n
service-session-id:0123456\n
2.2. 签名key设计

一般客户端请求的接口类型有三种,分别是有登录状态和无登录状态以及登录这个特殊接口。无登录状态前的接口都是服务为了提供能力而做的一些接口,相比而言都是提供通用能力的。不涉及客户个人信息相关。安全风险较小。

用户登录后的接口一般都是涉及到客户信息的接口,隐私泄露风险较大。因此对于每一种状态可采用不同的key值设计。讲风险降到最低。

2.2.1. 用户未登录签名key值

用户未登录时,平台提供通用能力,调用服务端接口时使用约定好的固定SK进行接口签名鉴权即可。固定SK由后台提供16位的随机字符串。

2.2.2. 用户登录签名key值

我们知道,所有在客户端和前端保存的key值永远不是最安全的,有可能被拆包而发现对应的加密SK,从而被不法分子破解,因此用户登录时,传输密码时,如果使用固定key,有可能body体被解开,密码被泄露的风险。

登录时用户会输入密码,而服务端也知道用户加密后的密码,那么使用用户输入的密码当做key则是最安全的方式。并且交互过程中不需要将用户密码放在body体重传到后端进行校验,只需校验签名的准确性即可。这样就可以极大的增加用户密码的安全性。

用户登录验证时会输入用户的密码,则登录时用户密码作为签名的key进行鉴权校验。加密key为:SHA256(LOWER(MD5(passwd)),salt),salt为用户的盐值,可以使用用户的手机号。

2.2.3. 用户登录签名key值

用户登录成功之后,所有接口都要有鉴权,为了每个用户安全起见,针对每个用户颁发自己的SK,登录成功后获取。这样客户端将sercet保存到内存中,可以有效防止SK泄露。

  • 用户注册成功后,针对用户账户后台生成16位的sercet

  • 用户登录成功后,后台返回用户的sercet

  • 登录之后的接口鉴权使用sercet进行鉴权。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、接口合法性校验流程

请求合法性校验流程如下:

58288e9d320862f350039c0b4c656781.png

1、首先对接口的请求头的nonce进行5分钟内是否重复的校验,可以有效的防止重放攻击。

2、然后对时间戳进行校验,防止客户端时间篡改攻击。

3、之后对请求的MD5进行校验,防止对请求体进行篡改。

4、最后将nonce,date,md5以及session进行组合签名校验,校验签名值是否成功。可以有效防止上面单一修改验证通过,但签名值校验不通过的问题。

基于以上的校验,基本上可以防止大部分攻击场景。当然为了更加安全,你还可以增加黑白名单限制、接口访问限流、用户常用设备绑定、用户异地登录等保护用户财产的安全性设计。

好了,不知道这篇文章大家对安全的设计是否有了更深刻的理解呢?大家有没有更好地接口安全设计方案,可以一起聊一聊哈。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

f081f6e07113e2a30ffc652a423dfcc3.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

bb791fd1ae56e76f66120062af523eff.png

860a638adac8a480019eb6f4cf1d3331.png02752b4cd69ec766fe43733c066c1387.png6063e894307c8033c546a7162b7bf894.pngc2f5df43c7fbc99c508a77a2925f7651.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
45、系统安全、可靠性与稳健设计:软硬件防护策略 本文深入探讨了系统安全、可靠性和稳健性设计中的软硬件防护策略。内容涵盖软件优化与安全编码实践,如volatile关键字使用、强类型检查和条件判断规范;详细介绍了软件测试策略与工具,包括黑盒、白盒和灰盒测试,以及静态分析、MC/DC、故障注入和模糊测试等方法;同时阐述了硬件层面的防护措施,如硬件自测试设计、侧信道攻击防御(定时、电磁、电源、温度、声学和热成像)及持续测试的重要性。最后提出了整体实施流程与策略选择建议,强调通过综合手段保障系统长期稳定与安全运行。 阅读详情

相关推荐

http访问接口

接口访问,使用http协议请求对应服务器接口,返回数据进行解析,

接口访问

最新理解,访问一个函数的方式,首先理解访问原理, 访问有两种,一种是主动调用,调用函数的方法。 第二种访问方式,是将自己传入,在被调用的时候,可以访问当前类的方法了,因为已经本身已经传入进去了。 举例: 小明,计算机接口方法 老婆婆,计算机接口方法 计算器 计算机接口 计算器(interface 需要计算){ 需要计算.计算机接口方法; } ...

pvmsmfchcs的博客 643

chipseeker Y叔

这一次讲解非常重要的peak注释,注释在ChIPseeker里只需要用到一个函数annotatePeak,它可以满足大家各方面的需求。 输入 当然需要我们上次讲到的BED文件,ChIPseeker自带了5个BED文件,用getSampleFiles()可以拿到文件的全路径,它返回的是个named list,我这里取第4个文件来演示。annotatePeak的输入也可以是GRanges对象,你如果用R做peak calling的话,直接就可以衔接上ChIPseeker了。 require(ChIPseeke

生信小博士的博客 1590

使用应用程序接口访问openGauss-JDBC

JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问接口,应用程序可基于它操作数据。openGauss库提供了对JDBC 4.0特性的支持,需要使用JDK1.8版本编译程序代码,不支持JDBC桥接ODBC方式。在linux服务器端源代码目录下执行build.sh,获得驱动jar包postgresql.jar,包位置在源代码目录下。

Oliviahome的博客 1152

GATK SNP过滤参数优化:从标准到个性化调整的实践指南

本文深入探讨了GATK SNP过滤参数的个性化调整策略,强调不应盲目套用官方标准参数。文章详细拆解了QD、FS、SOR等关键过滤参数的含义,并提供了通过数据分布分析、文献调研和迭代测试来确定适合自身数据(如动植物重测序)最佳阈值的实践方法,旨在帮助研究者在保留真实变异与剔除假阳性信号之间找到最优平衡。

weixin_29216049的博客 278

Ubuntu HackRF One、GNU Radio、Gqrx相关环境搭建

本文介绍Ubuntu HackRF One、GNU Radio、Gqrx相关环境搭建方法。

无线通信实验室 1万+

网络通信——HTTP接口访问——POST方式调用HTTP接口

GET方式的毛病在于:请求参数只能以“参数名=参数值&参数名=参数值”这样的格式添加到接口地址末尾,使得它无法传送复杂结构的请求报文。 POST方式把接口地址与请求报文分开,允许使用自定义的报文格式(如JSON),由此扩大了该方式的应用场景。 =======================================================================...

小白龙白龙马的博客 2525

Avellaneda & Stoikov模型实战解析:如何动态调整做市策略参数

本文深入解析Avellaneda & Stoikov模型在动态调整做市策略参数中的应用,重点探讨库存状态、剩余时间、风险系数和订单深度等核心参数的实战技巧。通过加密货币市场的实际案例,展示如何根据市场波动和流动性动态调整参数,提升做市策略的盈利能力和风险控制水平。

weixin_29070861的博客 203

SpringBoot访问外部接口的7种方式

在日常的开发工作中,我们不可避免的会需要访问外部模块的接口,或者外部的url链接,来实现某些操作。这个时候,就需要有一些机制来支持我们功能的开发,例如我们熟悉的FeignClient、RestTemplate、HttpClient不同的机制,都可以实现。但是这些实现方式又不仅限于这三种方式,还存在其他的处理方式,这些方式各有不同的优点和适用场景,了解他们可以有助于在我们开发中提供更多的选择。接下来,我们逐一介绍下。

竹林幽深 2528

电源工程师必看:平均电流模式BUCK双环控制详解(从传递函数到Psim仿真)

本文详细解析了平均电流模式BUCK变换器的双环控制策略,从传递函数推导到Psim仿真实现。针对电源工程师关注的环路设计和稳定性问题,深入比较了电压模式、峰值电流模式和平均电流模式的优缺点,并提供了12V/3A BUCK变换器的完整设计案例,帮助工程师掌握平均电流控制这一中高功率应用的首选方案。

weixin_42696271的博客 398

【制作100个unity游戏之22】3DRPG游戏开发07——其他详细的设计

我们会有有很多单例,如果每个单例都去写会很麻烦,所以我们定义泛型单例模式 Singleton,我们将所有的单例都继承这个泛型单例,就省略很多重复的工作定义一个GameManager类,继承Singleton,控制整个游戏的进度,比如如果主角死了,广播,游戏结束调用。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2577

在访问接口时的几种方式

1.不指定get或者post方式的情况下,直接把参数写在后面 exportconstgetStationsByLine=lineId=>request(`/api/system/line-stations?lineId=${lineId}`) 2.get接口请求数据时,注意加上.get然后使用时可以直接传递参数 exportconstfindTimeByPatternId=params=>request.get('/api/ieRt/findTimeByPatt...

qq_40608283的博客 1506

使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模

双机系统(Two-Machine System)是电力系统中用于研究动态稳定性和控制策略的一个典型模型。它由两台同步发电机通过输电网络相互连接,模拟实际电网中的互联操作。当发生短路故障时,系统的暂态稳定性会受到挑战,可能导致发电机失步或电压崩溃。本教程将带你使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析。

amy_mhd的博客 216

服务老是被攻击?教你设计一套安全的接口访问策略,非常稳健

不知道大家公司对接口安全这块是怎么考量的,但是对于面向公网提供服务的产品来说,这个可以说是很致命的了。那么,该如何设计一套比较安全的接口访问策略呢?

Innocence_0的博客 943

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

AI安全评估盲区:攻击策略选择如何导致安全评级误判

在人工智能安全领域,评估模型的稳健性和对齐性是确保其可靠部署的核心环节。传统评估方法通常依赖于构建静态的攻击策略库进行测试,其原理是通过模拟已知攻击模式来验证模型的防御能力。然而,这种方法的局限性在于,它难以覆盖人类恶意与创造力所衍生的未知、自适应攻击向量,从而可能高估模型在实际开放环境中的安全性。从技术价值看,一个健壮的评估体系应能真实反映模型面对动态、复杂威胁时的表现,这是AI系统能否安全应用于金融、客服、内容审核等高风险场景的关键前提。本文聚焦于Agentic AI(代理式人工智能)的安全评估,深入剖

weixin_29034963的博客 294

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java 安全 19:微服务接口安全(服务间认证)

微服务接口安全认证指南 本文深入探讨微服务架构中的服务间认证机制,包含以下核心内容: 风险分析:揭示未授权访问、服务身份伪造和权限滥用三大安全隐患,通过真实案例说明安全漏洞的危害性。 认证机制:对比用户认证与服务间认证的本质区别,强调机器信任机制的关键特性。 技术方案:详细解析API密钥、JWT令牌、双向TLS等五种主流认证方案,提供Spring Boot代码示例。 架构设计:提出包含身份验证、权限校验、防伪造和审计追踪的完整安全流程。 实践建议:针对不同场景给出技术选型指导和安全最佳实践。 本文为微服务开

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

bert-base-chinese模型安全:防御策略详解

本文介绍了基于星图GPU平台自动化部署bert-base-chinese预训练模型镜像的实践方法。该平台支持一键式部署与运行,便于快速构建中文自然语言处理服务。通过集成输入过滤、访问控制与容器安全策略,可有效提升模型在文本分类、情感分析等场景下的安全性与稳定性,助力AI应用高效开发与落地。

weixin_36487018的博客 681

警惕!Ollama大模型工具的安全风险及应对策略

Ollama的安全风险并非不可克服。通过采取国家网络安全通报中心建议的安全加固措施,我们可以有效降低风险,保护我们的数据和系统。在这个充满挑战的时代,让我们携手共进,用技术的力量守护安全的防线,让人工智能的发展更加稳健、可靠。

码事漫谈 1561

服务器被DDOS跟CC攻击了怎么处理,如何抵御攻击?

而 CC 攻击更偏向“应用层”,它模拟真实用户不断访问动态页面、接口或登录行为,消耗服务器计算资源,往往在带宽并未完全打满的情况下就能造成服务不可用。真正成熟的防御体系,并不是完全杜绝攻击,而是在攻击发生时,业务依然能够保持可控、可恢复、可持续。CDN 节点分布在各地,天然具备分散流量的能力,攻击流量会被分摊到多个节点,减少单一服务器的压力。在应急阶段结束后,更重要的是建立长期、系统化的防御策略。无论是企业官网、电商平台,还是游戏、接口服务,一旦被攻击,轻则访问缓慢、用户流失,重则业务中断、数据风险增加。

YOKEhn的博客 976

小程序被黑客攻击,如何防御!

小程序如何解决攻击问题

@云安全小杜 3030
上一篇: 为什么高性能场景选用 Postgres SQL 而不推荐使用 MySQL?
下一篇: 8种专坑同事 SQL写法,性能降低100倍,不来看看?
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值