基于时间的侧信道攻击与防护
字数 978 2025-11-27 04:32:19
基于时间的侧信道攻击与防护
1. 侧信道攻击的基本概念
侧信道攻击(Side-Channel Attack)不直接攻击密码算法或代码逻辑,而是通过分析系统运行时的物理特征(如时间、功耗、电磁辐射等)推断敏感信息。
- 时间侧信道攻击:攻击者通过测量不同操作所消耗的时间差异(如密码比较、分支判断),逐步推导出密钥、密码或业务数据。
- 典型场景:登录认证中的密码比较、加密算法中密钥相关的条件判断、数据库查询的响应时间差异等。
2. 攻击原理与示例
(1)漏洞成因
代码中存在依赖敏感数据的分支或循环,导致执行时间与数据内容相关。例如:
def verify_password(input_password, real_password):
for i in range(len(input_password)):
if input_password[i] != real_password[i]:
return False # 发现不一致立即返回
return True
问题:比较"abc"与"abd"时,前两个字符相同,直到第三个字符才返回错误,耗时更短;而比较"abc"与"xyz"时,第一个字符即返回,耗时更短。攻击者通过多次测量可逐字符破解密码。
(2)攻击步骤
- 基准测量:记录正常请求的平均响应时间(如比较100次"a"与"a")。
- 逐字符爆破:
- 提交密码
p1c、p2c...(c为猜测字符),若某个字符的响应时间显著更长,说明前几位匹配,程序进行了更多次比较。 - 重复直至破解全部字符。
- 提交密码
3. 防护方案
(1)常数时间比较
确保操作耗时与敏感数据无关:
import secrets
def constant_time_compare(a, b):
# 使用HMAC或标准库中的安全比较函数
return secrets.compare_digest(a, b)
原理:无论是否匹配,均遍历全部字符后才返回结果,消除时间差异。
(2)随机延迟注入
在敏感操作前添加随机等待时间,干扰时间测量:
import time
import random
def verify_password_with_delay(input_password, real_password):
result = constant_time_compare(input_password, real_password)
time.sleep(random.uniform(0.001, 0.005)) # 添加随机延迟
return result
注意:随机延迟需覆盖正常操作的时间波动范围,否则攻击者可通过多次采样统计消除噪声。
(3)业务层防护
- 限制尝试频率:同一账号连续失败后锁定或增加延迟。
- 统一错误信息:避免通过响应内容区分错误原因(如“用户名不存在”vs“密码错误”)。
4. 进阶攻击与防护
(1)网络抖动的影响
- 攻击者可能通过本地部署或高精度计时器减少网络干扰。
- 防护需结合服务端延迟控制与代码级常数时间操作。
(2)其他侧信道扩展
- 缓存侧信道:通过CPU缓存命中率推断数据(如Meltdown/Spectre漏洞)。
- 功耗分析:监测设备功耗变化破解密钥(常见于硬件安全)。
5. 实战测试方法
使用工具(如time命令或Python的timeit模块)模拟攻击:
import time
def measure_compare_time(target, guess):
start = time.perf_counter_ns()
constant_time_compare(target, guess) # 替换为漏洞代码进行对比
return time.perf_counter_ns() - start
# 测试:比较"abcx"和"abcy" vs "abcx"和"xyzq"的时间差异
总结:时间侧信道攻击揭示“代码逻辑安全≠运行时安全”,防护需结合常数时间算法、业务逻辑限制及系统级噪声注入。