什么是计时攻击?Spring Boot 中该如何防御?

密码侧信道分析实验-计时工攻击 密码侧信道分析—计时攻击模拟实验 阅读详情

小编最近在研究 Spring Security 源码,发现了很多好玩的代码,抽空写几篇文章和小伙伴们分享一下。

很多人吐槽 Spring Security 比 Shiro 重量级,这个重量级不是凭空来的,重量有重量的好处,就是它提供了更为强大的防护功能。

比如最近看到的一段代码:

protected final UserDetails retrieveUser(String username,
        UsernamePasswordAuthenticationToken authentication)
        throws AuthenticationException {
    prepareTimingAttackProtection();
    try {
        UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username);
        if (loadedUser == null) {
            throw new InternalAuthenticationServiceException(
                    "UserDetailsService returned null, which is an interface contract violation");
        }
        return loadedUser;
    }
    catch (UsernameNotFoundException ex) {
        mitigateAgainstTimingAttack(authentication);
        throw ex;
    }
    catch (InternalAuthenticationServiceException ex) {
        throw ex;
    }
    catch (Exception ex) {
        throw new InternalAuthenticationServiceException(ex.getMessage(), ex);
    }
}
复制代码

这段代码位于 DaoAuthenticationProvider 类中,为了方便大家理解,我来简单说下这段代码的上下文环境。

当用户提交用户名密码登录之后,Spring Security 需要根据用户提交的用户名去数据库中查询用户,这块如果大家不熟悉,可以参考松哥之前的文章:

  1. Spring Security 如何将用户数据存入数据库?
  2. Spring Security+Spring Data Jpa 强强联手,安全管理只有更简单!

查到用户对象之后,再去比对从数据库中查到的用户密码和用户提交的密码之间的差异。具体的比对工作,可以参考Spring Boot 中密码加密的两种姿势!一文。

而上面这段代码就是 Spring Security 根据用户登录时传入的用户名去数据库中查询用户,并将查到的用户返回。方法中还有一个 authentication 参数,这个参数里边保存了用户登录时传入的用户名/密码信息。

那么这段代码有什么神奇之处呢?

我们来一行一行分析。

源码梳理

1

首先方法一进来调用了 prepareTimingAttackProtection 方法,从方法名字上可以看出,这个是为计时攻击的防御做准备,那么什么又是计时攻击呢?别急,松哥一会来解释。我们先来吧流程走完。prepareTimingAttackProtection 方法的执行很简单,如下:

private void prepareTimingAttackProtection() {
    if (this.userNotFoundEncodedPassword == null) {
        this.userNotFoundEncodedPassword = this.passwordEncoder.encode(USER_NOT_FOUND_PASSWORD);
    }
}
复制代码

该方法就是将常量 USER_NOT_FOUND_PASSWORD 使用 passwordEncoder 编码之后(如果不了解 passwordEncoder,可以参考 Spring Boot 中密码加密的两种姿势!一文),将编码结果赋值给 userNotFoundEncodedPassword 变量。

2

接下来调用 loadUserByUsername 方法,根据登录用户传入的用户名去数据库中查询用户,如果查到了,就将查到的对象返回。

3

如果查询过程中抛出 UsernameNotFoundException 异常,按理说直接抛出异常,接下来的密码比对也不用做了,因为根据用户名都没查到用户,这次登录肯定是失败的,没有必要进行密码比对操作!

但是大家注意,在抛出异常之前调用了 mitigateAgainstTimingAttack 方法。这个方法从名字上来看,有缓解计时攻击的意思。

我们来看下该方法的执行流程:

private void mitigateAgainstTimingAttack(UsernamePasswordAuthenticationToken authentication) {
    if (authentication.getCredentials() != null) {
        String presentedPassword = authentication.getCredentials().toString();
        this.passwordEncoder.matches(presentedPassword, this.userNotFoundEncodedPassword);
    }
}
复制代码

可以看到,这里首先获取到登录用户传入的密码即 presentedPassword,然后调用 passwordEncoder.matches 方法进行密码比对操作,本来该方法的第二个参数是数据库查询出来的用户密码,现在数据库中没有查到用户,所以第二个参数用 userNotFoundEncodedPassword 代替了,userNotFoundEncodedPassword 就是我们一开始调用 prepareTimingAttackProtection 方法时赋值的变量。这个密码比对,从一开始就注定了肯定会失败,那为什么还要比对呢?

计时攻击

这就引入了我们今天的主题--计时攻击。

计时攻击是旁路攻击的一种,在密码学中,旁道攻击又称侧信道攻击、边信道攻击(Side-channel attack)。

这种攻击方式并非利用加密算法的理论弱点,也不是暴力破解,而是从密码系统的物理实现中获取的信息。例如:时间信息、功率消耗、电磁泄露等额外的信息源,这些信息可被用于对系统的进一步破解。

旁路攻击有多种不同的分类:

  • 缓存攻击(Cache Side-Channel Attacks),通过获取对缓存的访问权而获取缓存内的一些敏感信息,例如攻击者获取云端主机物理主机的访问权而获取存储器的访问权。
  • 计时攻击(Timing attack),通过设备运算的用时来推断出所使用的运算操作,或者通过对比运算的时间推定数据位于哪个存储设备,或者利用通信的时间差进行数据窃取。
  • 基于功耗监控的旁路攻击,同一设备不同的硬件电路单元的运作功耗也是不一样的,因此一个程序运行时的功耗会随着程序使用哪一种硬件电路单元而变动,据此推断出数据输出位于哪一个硬件单元,进而窃取数据。
  • 电磁攻击(Electromagnetic attack),设备运算时会泄漏电磁辐射,经过得当分析的话可解析出这些泄漏的电磁辐射中包含的信息(比如文本、声音、图像等),这种攻击方式除了用于密码学攻击以外也被用于非密码学攻击等窃听行为,如TEMPEST 攻击。
  • 声学密码分析(Acoustic cryptanalysis),通过捕捉设备在运算时泄漏的声学信号捉取信息(与功率分析类似)。
  • 差别错误分析,隐密数据在程序运行发生错误并输出错误信息时被发现。
  • 数据残留(Data remanence),可使理应被删除的敏感数据被读取出来(例如冷启动攻击)。
  • 软件初始化错误攻击,现时较为少见,行锤攻击(Row hammer)是该类攻击方式的一个实例,在这种攻击实现中,被禁止访问的存储器位置旁边的存储器空间如果被频繁访问将会有状态保留丢失的风险。
  • 光学方式,即隐密数据被一些视觉光学仪器(如高清晰度相机、高清晰度摄影机等设备)捕捉。

所有的攻击类型都利用了加密/解密系统在进行加密/解密操作时算法逻辑没有被发现缺陷,但是通过物理效应提供了有用的额外信息(这也是称为“旁路”的缘由),而这些物理信息往往包含了密钥、密码、密文等隐密数据。

而上面 Spring Security 中的那段代码就是为了防止计时攻击。

具体是怎么做的呢?假设 Spring Security 从数据库中没有查到用户信息就直接抛出异常了,没有去执行 mitigateAgainstTimingAttack 方法,那么黑客经过大量的测试,再经过统计分析,就会发现有一些登录验证耗时明显少于其他登录,进而推断出登录验证时间较短的都是不存在的用户,而登录耗时较长的是数据库中存在的用户。

现在 Spring Security 中,通过执行 mitigateAgainstTimingAttack 方法,无论用户存在或者不存在,登录校验的耗时不会有明显差别,这样就避免了计时攻击。

可能有小伙伴会说,passwordEncoder.matches 方法执行能耗费多少时间呀?这要看你怎么计时了,时间单位越小,差异就越明显:毫秒(ms)、微秒(µs)、奈秒(ns)、皮秒(ps)、飛秒(fs)、阿秒(as)、仄秒(zs)。

另外,Spring Security 为了安全,passwordEncoder 中引入了一个概念叫做自适应单向函数,这种函数故意执行的很慢并且消耗大量系统资源,所以非常有必要进行计时攻击防御。

关于自适应单向函数,这是另外一个故事了,松哥抽空再和小伙伴们聊~

好啦,今天就先和小伙伴们聊这么多,小伙伴们决定有收获的话,记得点个赞,关注一下来鼓励小编呦!

safeEqual & 计时攻击 防止计时攻击 计时攻击是边信道攻击(或称"侧信道攻击", Side Channel Attack, 简称SCA) 的一种, 边信道攻击是一种针对软件或硬件设计缺陷,走“歪门邪道”的一种攻击方式。 这种攻击方式是通过功耗、时序、电磁泄漏等方式达到破解目的。 在很多物理隔绝的环境中,往往也能出奇制胜,这类新型攻击的有效性远高于传统的密码分析的数学方法 package main import ( "fmt" "time" ) //时间复杂度恒定,均匀 func safeEqual(a, b string) 阅读详情

相关推荐

WebSocket协议深度解析与Spring Boot实战:从原理到高可用实时通信系统构建

在构建实时Web应用时,传统的HTTP请求-响应模式因其单向、无状态的特性,难以满足聊天、推送、在线协作等场景对低延迟、双向通信的需求。为解决这一核心矛盾,WebSocket协议应运而生,它在TCP连接之上建立了全双工通信通道,允许服务器与客户端在握手后随时主动推送数据,从而大幅降低了延迟与开销。其技术价值在于彻底改变了Web的实时交互范式,成为在线游戏、金融行情、协同编辑等高性能应用的基础设施。理解其握手过程中的Sec-WebSocket-Key验证机制与数据帧格式,是掌握协议本质、进行高效调试与性能优化

weixin_30443075的博客 336

黑客技术:计时攻击 TIMING ATTACKS

相信刚看到这段源码的人会感觉挺奇怪的,这个函数的功能是比较两个字符串是否相等,如果要判断两个字符串是否相等,正常人的写法应该是下面这个样子的(来自JDK8 的 `String.equals()`-有删减):

安正勋的博客 9780

【java】计时攻击是什么

假设在验证密码 “aassword” 时,首字母 “a” 的验证时间明显较长,而在验证密码 “bassword” 时,首字母 “b” 的验证时间较短。请注意,尽管这些方法可以增加抵御计时攻击的能力,但计时攻击是一种复杂而受环境影响的攻击方式,可能受到其他因素的影响,如系统负载、噪声等。例如,如果用户密码是 “password”,攻击者可以尝试不同的密码组合,例如 “aassword”、“bassword”、“cassword” 等,然后观察每个字符的验证时间。这些哈希函数的设计目标之一就是抵御计时攻击。

九师兄 690

计时攻击在Spring Boot中该如何防御?

很多人吐槽 Spring Security 比 Shiro 重量级,这个重量级不是凭空来的,重量有重量的好处,就是它提供了更为强大的防护功能。 比如我最近看到的一段代码: protectedfinalUserDetailsretrieveUser(Stringusername, UsernamePasswordAuthenticationTokenauthentication) throwsAuthenticationException{ prepareTimingAttack...

Java圈全能架构师的博客 553

从零搭建Synopsys EDA环境:Ubuntu系统下的完整安装与避坑指南

本文详细介绍了在Ubuntu系统下从零搭建Synopsys EDA环境的完整流程,包括系统配置、安装文件准备、核心工具安装、License配置及常见问题排查。特别针对数字IC设计场景,提供了VCS、Verdi、Design Compiler等EDA Tools的安装避坑指南和性能优化建议,帮助开发者高效搭建稳定的开发环境。

weixin_33738982的博客 491

4.UE数字人工程运行逻辑及程序逻辑

UE数字人工程运行逻辑及程序逻辑

6086

Spring Boot防御计时攻击:从原理到恒定时间比较实战

在Web应用安全领域,旁路攻击是一种通过分析系统物理特征(如执行时间、功耗)而非直接破解算法来获取敏感信息的攻击方式。计时攻击作为典型的旁路攻击,其原理在于利用代码执行时间与处理数据的相关性,通过精确测量响应时间差异来推断密钥、密码等机密信息。这种攻击对认证体系构成严重威胁,可导致身份绕过与信息泄露。在Spring Boot等现代Web框架构建的应用中,用户登录、API密钥校验等涉及字符串比较的场景尤为脆弱。为有效防御,需采用恒定时间比较算法,确保无论比较结果如何,代码执行路径与耗时恒定。本文以Spring

weixin_29324877的博客 301

详解【计算机类&面试真题】军队文职考试——第7期:C盘格式化需要注意什么?| 两台笔记本连起来后ping不同,可能存在哪些问题?| 模拟信号到数字信号是如何转化的?| 计算机由哪些部件组成?

这是我分享的系列面试知识——军队文职(计算机类)面试真题详解(第7期)。本期分享:两台笔记本连起来后ping不同,你觉得可能存在哪些问题?模拟信号到数字信号是如何转化的?谈一谈计算机由哪些部件组成?如何加强计算机网络安全管理?若通过域名无法访问,而通过IP地址能访问。这是怎么回事?你将如何解决?谈一谈C盘格式化需要注意什么?开放类题目:如果应聘的岗位和你想的差距很远,你怎么办?

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1922

AI安全新威胁:加密思维链的旁路转录攻击与防御实践

在AI应用开发中,大语言模型(LLM)的思维链技术通过展示推理步骤提升了模型输出的可解释性。其基本原理是让模型将复杂问题分解为多个中间步骤,从而模拟人类的推理过程。这项技术的核心价值在于增强了AI决策的透明度和可靠性,广泛应用于智能问答、代码生成和数据分析等场景。然而,当涉及敏感信息时,开发者常采用加密方式保护思维链内容。近期安全研究发现,即使思维链本身被加密,攻击者仍可通过分析API的旁路信息(如响应时间、Token消耗等)推断原始推理逻辑,这种**旁路转录攻击**不直接破解加密算法,而是利用系统运行时特

weixin_34226182的博客 601

【三维激光扫描】第二章:国内外三维激光扫描设备简介

地面三维激光扫描仪是地面激光扫描系统中最主要的硬件设备,近年来得到了快速发展,主要体现在品牌数量、性能指标、类型等方面的变化。本章主要介绍国内外主要设备的基本情况,对国内外研究现状进行分析,最后指出目前存在的问题与未来的发展趋势。 2.1 国外地面三维激光扫描仪简介 目前,生产地面三维激光扫描仪的公司比较多,随着地面三维激光扫描技术应用普及程度的不断提高,国外产品在中国的市场目前还占主导地位。它们各自的产品在性能指标上有所不同,以下简要介绍有代表性的公司产品。 2.1.1 奥地利 Riegl公司的.

智慧空间实验室 4643

语音信号的AGC自适应增益调整matlab仿真

语音信号的自动增益控制(Automatic Gain Control,AGC)是音频处理领域中的一项重要技术。其核心功能是实时调整输入信号的幅度,使其保持在一定范围内,以优化输出信号的质量。AGC广泛应用于语音通信、语音识别、音频录制和播放等领域,旨在解决输入信号幅度波动问题,确保输出信号的稳定性和清晰度。一、AGC的基本原理1.1 幅度调整自动增益控制的基本原理是根据输入信号的幅度动态地调整系统的增益。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 922

松哥写的《深入浅出Spring Security》真不错

安全管理是Java应用开发中无法避免的问题,目前主流的安全管理框架就是SpringSecurity和Shiro,其中Shiro一直以使用简单和轻量级著称。然而,随着SpringBoot和微服务的流行,SpringSecurity受到越来越多开发者的重视,因为SpringSecurity在和SpringBoot整合时具有先天优势。 目前市面上缺少系统介绍SpringSecurity的书籍,网上的博客内容又比较零散,这为很多初次接触SpringSecurity的Java工程师学习这门技术带来诸多...

夏天又到了的专栏 1247

在 SAP S/4HANA Private Cloud 中把标准 CDS View 发布为 OData:可操作的四条路径与完整示例

在 ADT 中创建。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 726

深入解析Slowloris慢速HTTP攻击:原理、模拟与立体防御实战

HTTP协议作为Web通信的基石,其连接管理与超时机制的设计初衷是为了兼容网络延迟和客户端差异。然而,攻击者正恶意利用协议规范中的“灰色地带”,通过极慢的速度发送请求头或请求体,长时间占用服务器的连接线程与内存资源,从而耗尽服务器的并发处理能力。这种被称为Slowloris或慢速HTTP拒绝服务攻击的技术,因其极低的资源消耗、高度的隐蔽性和协议合规性,对Web服务器构成了严重威胁。在应用场景上,它常被用于针对Nginx、Apache等常见Web服务器的资源耗尽攻击,尤其在高并发业务场景下危害显著。理解其工作

congbao6525的博客 382

把 SAP ABAP ALE 与 IDoc 玩明白:从架构、配置到排错的一套闭环方法

本文介绍了SAP集成中ALE与IDoc的核心概念与实战应用。ALE作为SAP分布式应用框架,通过异步消息机制实现系统间数据交换,其三层架构隔离业务与传输细节。IDoc作为标准化消息容器,包含控制、数据和状态记录。文章详细解析了配置要点(端口、伙伴参数)、处理流程(Process Code)、排错工具(BD87、WE09)及同系统测试方法,并提供了发送程序代码骨架。通过架构认知→配置→开发→运维的完整路径,帮助读者掌握ALE/IDoc的实际操作技能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 222

四足狗机器人硬件开发技术栈详解

本文系统介绍了四足狗机器人的硬件开发技术,重点分析了五大核心模块:机械结构(骨架设计)、动力系统(关节驱动)、感知系统(环境监测)、控制系统(决策中枢)和电源系统(能源管理)。文章详细阐述了各模块的选型标准、技术要点和协同设计原则,提供了从需求定位到组装调试的完整开发流程,并针对常见问题给出解决方案。随着材料轻量化、模块标准化和AI集成化的发展趋势,四足机器人硬件将向更灵活、更智能的方向演进,为工业巡检、应急救援等场景提供更强大的移动平台支持。

start_up_go的博客 284

没想到 Hash 冲突还能这么玩,你的服务中招了吗?

点击上方“五分钟学算法”,选择“星标”公众号重磅干货,第一时间送达背景 其实这个问题我之前也看到过,刚好在前几天,洪教授在某个群里分享的一个《一些有意思的攻击手段.pdf》,我觉得这个话...

程序员吴师兄的博客 287

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java机密计算实战:Intel SGX与Spring Boot集成保护敏感数据

机密计算是一种通过硬件创建可信执行环境来保护数据处理过程中数据机密性与完整性的前沿安全技术。其核心原理是在CPU内部构建隔离的加密内存区域,确保代码和数据即便在运行时也不被操作系统或特权用户访问。这项技术的核心价值在于为云原生和微服务架构提供了运行时数据安全的新范式,尤其适用于金融交易、医疗健康和AI模型参数等敏感场景。通过将Intel SGX与Spring Boot框架结合,开发者可以在Java应用中实现硬件级的数据保护,将最敏感的业务逻辑封装在飞地内,而通用框架功能运行在常规环境,从而在微服务架构中构建

weixin_30905133的博客 797

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring Boot+Vue影院售票系统实战:高并发选座与防超卖架构设计

在构建企业级Web应用时,高并发场景下的数据一致性是核心挑战之一,其背后涉及并发控制、分布式锁与状态机等关键技术原理。这些技术对于保障交易系统如电商库存、票务平台的业务正确性至关重要。本文以电影院售票系统为具体应用场景,深入剖析如何利用Redis Lua脚本实现原子性的座位库存预锁定,并结合数据库乐观锁与事务,构建多层防御体系来彻底解决“一票多卖”问题。通过实战演示了从技术选型、核心流程设计到部署上线的完整过程,为开发高可靠、高性能的在线交易系统提供了可直接复用的工程实践方案。

weixin_30697239的博客 414

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

短信炸弹与越权提权组合攻击:原理、渗透测试与纵深防御实战

在Web应用安全领域,短信验证码接口和权限控制是两项基础且关键的安全机制。短信接口通常用于身份验证,但其若缺乏频率限制和人机验证,可能被滥用于“短信炸弹”攻击,造成骚扰并干扰正常告警。权限控制的核心在于确保用户只能访问其授权范围内的资源,一旦校验逻辑存在缺陷,便会产生“越权”漏洞,允许用户执行未授权的操作。这两种漏洞单独存在时危害可控,但组合利用则可能形成致命的攻击链,例如攻击者可先用短信炸弹干扰管理员,再利用越权漏洞绕过二次验证,最终实现权限提升。本文通过一个金融科技公司的真实渗透测试案例,深入剖析了这种

weixin_34050519的博客 509

HTTPS+Gzip组合下的BREACH漏洞:原理、复现与纵深防御实战

在Web安全领域,TLS/SSL加密为HTTP通信提供了机密性保障,而Gzip压缩则是提升传输效率的通用技术。其原理在于通过算法消除数据冗余,但这也引入了一个隐蔽风险:压缩率会随内容重复度变化。攻击者可利用这一特性,通过观察加密响应包长度的细微差异,实施旁路攻击,从而推断出响应体中的敏感信息,如CSRF Token或API密钥。这种攻击凸显了即使加密也无法完全隐藏元数据(如长度)所带来的安全挑战。在工程实践中,对于涉及用户输入与机密数据共存的场景(例如动态页面或API响应),必须采用多层防御策略,包括在应用

ithome 410
上一篇: 3种 Springboot 全局时间格式化方式,别再写重复代码了
下一篇: 程序员:是不是但凡我有一个MySQL的问题回答不上来,就进不了你们公司?
java架构师小芷
博客等级 码龄6年 216粉丝 519原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值