3

我对安全性的东西不是很熟悉,但是遇到过这个用于防止定时攻击的恒定时间功能:

// shortcutting on type is necessary for correctness
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
  return false;
}

// buffer sizes should be well-known information, so despite this
// shortcutting, it doesn't leak any information about the *contents* of the
// buffers.
if (a.length !== b.length) {
  return false;
}

var c = 0;
for (var i = 0; i < a.length; i++) {
  /*jshint bitwise:false */
  c |= a[i] ^ b[i]; // XOR
}
return c === 0;

https://github.com/salesforce/buffer-equal-constant-time/blob/master/index.js

在考虑定时攻击时,想知道是否有标准的事情需要注意,以及上述的技术来解决这些问题。类似于OWASP 的 XSS 备忘单。谢谢!

4

2 回答 2

3

您可以做的最重要的事情之一就是使用适当的加密库和它们提供的辅助函数(例如,如果您使用的是 bcrypt.js 库,请使用它提供的比较函数,而不是进行自己的字符串比较)。每当您尝试实施自己的加密货币时,它都可能容易受到计时攻击。

但是,这类攻击可能很难执行 - 例如,比较字符串的时间(通常)存在非常小的差异,这将更难通过 Internet 检测到(尽管您可以使用大样本解决此问题) .

更容易被利用的攻击通常发生在您的代码存在某种外部交互的地方。例如,如果用户名有效,密码重置功能可能必须发送电子邮件(这可能很慢),如果用户名无效,则可能会立即返回。异步外部调用在这里可以提供帮助(无论如何对用户来说可能更好)。

大多数定时攻击都依赖于攻击者能够发出大量脚本请求并分析响应时间,因此您可以采取任何措施使这变得更加困难(例如,速率限制或验证码)也将为您提供一定程度的保护. 它不一定能解决它们,但会使它们更难实现。

实际上,除非你正在做一些与加密相关的事情,否则可能会有更大的威胁需要担心。


编辑:发表这篇文章几年后,Bcrypt.js 开发人员发现他们的时间安全字符串比较功能实际上不是。在他们使用它的上下文中(比较哈希),这不是一个可利用的问题,但它不应该用于任何需要考虑定时攻击的事情。

于 2017-12-11T17:24:08.147 回答
0

虽然您的实现应该是时间安全的(除了泄漏正确的长度,但这可能与上下文无关) - 仍然存在一个陷阱:优化。

这可能发生在编译时(即 C/++/#),或者在 java 的情况下,或者在运行时通过 JVM。不幸的是,优化可以(重新)引入计时侧通道 - 因此,我强烈建议您依赖经过验证的加密库/函数,例如 PHP 的 hash_equals 或 Java 的 MessageDigest.isEqual(Java SE 6 U17 之后)。

一般来说,不仅字符串比较会导致计时攻击。许多其他操作可能导致响应/执行时间的差异。

如果您对定时攻击的更多示例及其可能的缓解措施感兴趣,请参阅: https ://zgheb.com/i?v=blog&pl=81#05.11.2021_-_When_timing_matters

注意:我是上述博客的作者。

于 2021-11-12T09:31:40.420 回答