防止定时攻击的主要技术

时间:2017-12-10 21:42:45

标签: javascript security timing-attack

我对安全性不太熟悉,但是遇到了这个常量时间函数来防止时间攻击:

// 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's XSS Cheat Sheet这样的东西。谢谢!

1 个答案:

答案 0 :(得分:1)

防止计时攻击可以做的最重要的事情之一就是使用适当的加密库及其提供的帮助程序功能(例如,如果您使用的是bcrypt.js库,请使用它提供的比较功能,而不是做自己的字符串比较)。无论何时尝试实施自己的加密,它都可能容易受到时间攻击的影响。

这种类型的攻击可能很难执行 - 比较字符串的时间(通常)非常小,例如,通过互联网更难以检测到(尽管你可以解决这个问题)大样本)。

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

大多数计时攻击依赖于攻击者能够制作大量脚本请求并分析响应时间,因此您可以采取的任何措施(例如,速率限制或CAPTCHA)也将为您提供防护等级。它不一定能解决它们,但它会使它们更难实现。

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