在阅读了这的优秀答案之后,我了解到了侧通道攻击的存在。
从所提供的代码示例中,可以通过在给定各种输入时对代码进行计时来确定正确的密码。
for (i = 0; i < n; i++) {
if (password[i] != input[i]) {
return EFAIL;
}
}我能做些什么来确保我的代码不会受到这样的定时攻击?我特意保留了这个开放的答案,以便为各种常见的软件配置提供示例和最佳实践。
发布于 2019-10-30 15:01:51
侧通道攻击是出了名的难以检测,因为有许多侧通道,攻击者可以寻找。这包括但不限于:
维基百科有一个很好的列表,这仅仅是一个摘录。由于有这么多不同的侧通道,所以每个边通道都需要独立处理。
您的代码容易受到定时攻击,但您已经知道了。问题是,你怎么才能修好它?解决办法是做一个固定时间的比较。这样的代码就是一个例子:
difference = 0;
for (i = 0; i < n; i++) {
difference |= (password[i] ^ input[i]);
}
return difference == 0 ? E_OK : E_FAIL;此代码假定password和input长度相同,例如,因为它们是哈希函数的输出。代码将累积每对元素之间的位差,如果差异为零,则返回基于结果的结果。还请注意,您的友好优化C编译器可以自由地发现这是在做什么,并生成它将为您的原始(破碎)代码生成的程序集。您需要检查实际的(或使用为此设计的库函数)。
当然,这只会防止一种侧通道攻击,而不是其他攻击。
这完全取决于你所关注的侧频道。有些(如功耗)需要物理访问(或其他测量消耗的方法),因此如果攻击者在很远的地方,就不会出现问题。
通常,为了抵御侧通道攻击,您需要:
发布于 2019-10-30 15:04:29
我假设这个问题中的代码只是一个刻意琐碎的例子,因为在一个真实的系统你永远不会用明文存储密码。中。但是,如果您想用一个不容易受到定时攻击的实现来替换这个虚构的代码,那么您将确保该算法不会在第一个错误字符上终止,而是总是执行相同数量的比较:
bool isCorrect = true;
for (i = 0; i < PASSWORD_MAX_LENGTH; i++) {
if (password[i] != input[i]) {
isCorrect = false;
}
}
return isCorrect;然而,这也不是防止定时攻击的完全证据,因为取决于CPU处理这段代码的方式,失败时可能会花费更长或更短的时间。时间差异的一个可能来源可能是分支预测。
过于简化:当CPU注意到它在for-循环中处理一个if-条件,并且如果-条件在大多数情况下都是假的时,CPU将在假设它始终为false的前提下优化自己。这使得它能够更快地处理这个for-循环。但是,如果这个if语句突然变成真的,那么它会在CPU管道中引起相当大的混乱,这需要几个时钟周期来清理。因此,分支预测失败引起的时序差异可能是另一种可能的定时侧信道。这是很难避免的,因为它是CPU的一个特性,对开发人员来说是完全不透明的,甚至可以依赖于CPU的精确模型。要获得更多信息,请对幽灵脆弱性幽灵脆弱性进行一些研究。
但也有一种不同的方法来避免定时攻击,这是粗糙和简单,但有效的:添加一个随机延迟后,每次密码比较。如果延迟的长度来自密码安全伪随机数发生器,则会破坏攻击者所依赖的时间测量的准确性。
发布于 2019-10-30 15:10:33
我将尝试回答上述问题的陈述,在这里考虑的侧通道攻击是基于时间的,即。
定时攻击监视数据在运行密码系统或算法的硬件上进出CPU或内存的情况。只需观察执行密码操作所需时间的变化,就可以确定整个秘密密钥。这类攻击涉及时间测量的统计分析,并已在网络上得到了演示。
它不应逐字节检查输入并响应控制器/屏幕/用户界面,用户可以在控制器/屏幕/UI上检查输出是否正确,而是应该使用数据作为块,然后对输入数据执行相等的算术操作。
不好意思我的艺术作品不好。

这种攻击利用了可以消除的输出的统计分析。执行这类操作的一种方法是使用散列,不管密码的长度有多长,它总是生成一个固定长度的输出。
https://security.stackexchange.com/questions/220446
复制相似问题