首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止对身份验证的侧通道攻击?

如何防止对身份验证的侧通道攻击?
EN

Security用户
提问于 2019-10-30 14:22:52
回答 4查看 4.2K关注 0票数 18

在阅读了的优秀答案之后,我了解到了侧通道攻击的存在。

从所提供的代码示例中,可以通过在给定各种输入时对代码进行计时来确定正确的密码。

代码语言:javascript
运行
复制
for (i = 0; i < n; i++) {
  if (password[i] != input[i]) {
    return EFAIL;
  }
}

我能做些什么来确保我的代码不会受到这样的定时攻击?我特意保留了这个开放的答案,以便为各种常见的软件配置提供示例和最佳实践。

EN

回答 4

Security用户

发布于 2019-10-30 15:01:51

侧通道攻击是出了名的难以检测,因为有许多侧通道,攻击者可以寻找。这包括但不限于:

  • 定时攻击
  • 缓存攻击
  • 电力监控攻击
  • 声学密码分析

维基百科有一个很好的列表,这仅仅是一个摘录。由于有这么多不同的侧通道,所以每个边通道都需要独立处理。

,那么定时攻击呢?

您的代码容易受到定时攻击,但您已经知道了。问题是,你怎么才能修好它?解决办法是做一个固定时间的比较。这样的代码就是一个例子:

代码语言:javascript
运行
复制
difference = 0;
for (i = 0; i < n; i++) {
  difference |= (password[i] ^ input[i]);
}

return difference == 0 ? E_OK : E_FAIL;

此代码假定passwordinput长度相同,例如,因为它们是哈希函数的输出。代码将累积每对元素之间的位差,如果差异为零,则返回基于结果的结果。还请注意,您的友好优化C编译器可以自由地发现这是在做什么,并生成它将为您的原始(破碎)代码生成的程序集。您需要检查实际的(或使用为此设计的库函数)。

当然,这只会防止一种侧通道攻击,而不是其他攻击。

,另一边的频道呢?

这完全取决于你所关注的侧频道。有些(如功耗)需要物理访问(或其他测量消耗的方法),因此如果攻击者在很远的地方,就不会出现问题。

通常,为了抵御侧通道攻击,您需要:

  • 请注意,侧通道存在。
  • 检查这个侧通道是否可能是您的威胁模型中的潜在问题。
  • 检查通过这个侧通道泄露了什么信息
  • 检查如何防止泄漏此信息。
票数 13
EN

Security用户

发布于 2019-10-30 15:04:29

我假设这个问题中的代码只是一个刻意琐碎的例子,因为在一个真实的系统你永远不会用明文存储密码。中。但是,如果您想用一个不容易受到定时攻击的实现来替换这个虚构的代码,那么您将确保该算法不会在第一个错误字符上终止,而是总是执行相同数量的比较:

代码语言:javascript
运行
复制
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的精确模型。要获得更多信息,请对幽灵脆弱性幽灵脆弱性进行一些研究。

但也有一种不同的方法来避免定时攻击,这是粗糙和简单,但有效的:添加一个随机延迟后,每次密码比较。如果延迟的长度来自密码安全伪随机数发生器,则会破坏攻击者所依赖的时间测量的准确性。

票数 6
EN

Security用户

发布于 2019-10-30 15:10:33

我将尝试回答上述问题的陈述,在这里考虑的侧通道攻击是基于时间的,即。

定时攻击监视数据在运行密码系统或算法的硬件上进出CPU或内存的情况。只需观察执行密码操作所需时间的变化,就可以确定整个秘密密钥。这类攻击涉及时间测量的统计分析,并已在网络上得到了演示。

它不应逐字节检查输入并响应控制器/屏幕/用户界面,用户可以在控制器/屏幕/UI上检查输出是否正确,而是应该使用数据作为块,然后对输入数据执行相等的算术操作。

不好意思我的艺术作品不好。

这种攻击利用了可以消除的输出的统计分析。执行这类操作的一种方法是使用散列,不管密码的长度有多长,它总是生成一个固定长度的输出。

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/220446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档