防止正时攻击的主要技术



我对安全内容不是很熟悉,但是遇到了这种恒定的时间功能以防止计时攻击:

// 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备忘单。谢谢!

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

这些攻击可能很难执行 - 例如,(通常)在比较字符串的时间(通常)很难通过Internet检测到(尽管您可以使用它来解决此问题)大样本)。

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

大多数计时攻击都取决于攻击者能够提出大量的脚本请求并分析响应时间,因此您可以做的任何事情都可以使此更难(例如,费率限制或码头)也将为您提供一个防护等级。它不一定能解决它们,但会使它们更难实现。

实际上,除非您做了与加密货币有关的事情,否则可能会担心更大的威胁。


编辑:发表此帖子几年后,bcrypt.js开发人员发现他们的时正式安全字符串比较功能实际上不是。在上下文中,他们正在使用它(比较哈希),这不是一个可利用的问题,但不应将其用于定时攻击是一个关注的任何问题。

虽然您的实现应确定时间安全(距离正确的长度泄漏,但根据上下文的不同) - 仍然存在一个陷阱:优化。

这可能发生在编译时间(即C//#),也可能是在Java的情况下或在运行时通过JVM进行的。不幸的是,优化可以(重新)引入定时侧频道 - 因此,我强烈建议您依靠您依靠已验证的加密库/函数,例如for php或messagedigest.isequal.isequal.isequal.java se 6 U17 SE 6 U17 u17 u17 u17 u17)。

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

如果您对定时攻击及其可能缓解的进一步示例感兴趣,请参考:https://zgheb.com/i?v=blog&ppl=81#05.11.2021_-_when_timing_matters

注意:我是说博客的作者。

最新更新