进行RSA 4K验证函数实现时,其中注意事项之一是预防侧信道时序攻击,那么什么是侧信道时序攻击呢?
侧信道时序攻击是一种通过分析程序或硬件执行操作的时间差异来推断敏感信息(如密码、密钥等)的攻击方式。它属于侧信道攻击(Side-Channel Attack, SCA)的一种,不直接破解算法,而是利用物理或逻辑层面的信息泄露进行攻击。
1. 攻击原理
程序的执行时间可能受以下因素影响:
- 数据依赖性:某些操作(如分支判断、内存访问、加密运算)的时间会因输入数据不同而变化。
- 缓存命中/失效:CPU缓存是否命中会影响访问速度(如缓存时序攻击,Cache Timing Attack)。
- 算法优化缺陷:某些安全算法(如RSA、AES)的实现可能因未采用恒定时间(Constant-Time)编程而泄露信息。
攻击者通过精确测量目标操作的执行时间,结合统计方法,逐步推断出密钥或密码等机密数据。
2. 典型攻击场景
(1) 密码比较时序攻击
例如,一个简单的字符串密码比对函数:
bool check_password(char* input, char* correct) {
for (int i = 0; i < len; i++) {
if (input[i] != correct[i]) {
return false; // 发现不匹配立即返回
}
}
return true;
}
问题:如果 input 和 correct 的第一个字符不匹配,函数会立即返回;如果前几个字符匹配,则会多花一些时间。攻击者可以通过多次尝试并测量响应时间,逐步猜出正确密码。
防御方法:使用恒定时间比较(如 memcmp 的安全实现)。
(2) RSA / AES 加密时序攻击
某些加密算法(如RSA的模幂运算或AES的查表操作)的执行时间可能受密钥位的影响。例如:
- RSA 的 平方-乘算法(Square-and-Multiply)在遇到
1时会多一次乘法运算,导致时间差异。 - AES 的 S盒查表(SubBytes)可能因缓存命中情况泄露信息。
防御方法:
- 使用恒定时间算法(如屏蔽技术、避免分支)。
- 禁用硬件缓存(如AES-NI指令集)。
(3) 缓存时序攻击(Cache Timing Attack)
攻击者利用CPU缓存的访问时间差异推断敏感数据,例如:
- Flush+Reload:清空缓存后观察目标数据是否被加载,推断访问情况。
- Prime+Probe:填充缓存后测量目标操作是否导致缓存行被替换。
典型案例:
- Meltdown & Spectre(2018):利用CPU推测执行和缓存时序漏洞读取内核内存。
3. 防御措施
(1) 恒定时间编程(Constant-Time Programming)
确保代码执行时间不依赖敏感数据:
- 避免分支(如
if (secret == x))。 - 避免数据依赖的内存访问(如
array[secret])。 - 使用恒定时间算法(如
CRYPTO_memcmp)。
(2) 随机化延迟
在关键操作中插入随机延迟,干扰时间测量。
(3) 禁用或隔离缓存
- 对关键计算禁用缓存(如使用
_mm_clflush)。 - 使用专用硬件(如Intel SGX)隔离敏感计算。
(4) 算法级防御
- 使用抗侧信道的加密库(如OpenSSL的恒定时间实现)。
- 采用掩码技术(Masking)隐藏密钥。
总结
|
特点 |
说明 |
|
攻击目标 |
密码、加密密钥、隐私数据 |
|
依赖条件 |
程序执行时间与敏感数据相关 |
|
防御方法 |
恒定时间编程、缓存隔离、随机化延迟 |
|
现实影响 |
可远程破解加密系统(如TLS、SSH) |
侧信道时序攻击表明,即使算法本身安全,实现方式也可能引入漏洞。因此,安全编程必须考虑时间、功耗、电磁辐射等侧信道因素。
167

被折叠的 条评论
为什么被折叠?



