什么是为私钥分配内存的合理安全,合理便携的方式?

时间:2014-06-06 02:29:27

标签: c linux unix

我正在寻找为256位私钥分配存储空间的“最佳实践”。我想,至少,密钥不应该被分页到磁盘,并且可能还有一些其他攻击媒介需要担心(a la Hearbleed)。该解决方案必须可移植到Linux和BSD。

我看过一些事情:

  • TRESOR(不是BSD便携式)
  • Akamai的“安全堆”
  • David Shaw的secmalloc
  • 使用mlock禁止分页
  • 只需使用malloc,不用担心。粗略阅读表明这可能是LibreSSL的作用。

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

除非您有特殊要求,否则只使用malloc是理智的方法。它的优势在于valgrind和类似程序可以捕获使用错误,这是您可能担心的漏洞类型的主要方式之一。正如OpenSSL的惨败向我们展示的那样,尝试做一些花哨的事情并将其搞砸是一个很大的风险。

如果您的要求更高,那么这在很大程度上取决于您的使用情况。我将假设您的密钥是暂时的,否则避免将它们存储在磁盘上并没有多大意义。以下是我对特定风险的建议缓解措施:

  • 交换到磁盘:如果您的系统需要安全防范物理攻击,则根本不应该进行交换。单独尝试使用mlock保护特定数据是一件笑话。只需关闭交换并安装足够的内存,这是一个非问题。 mlock应被视为实时计划功能,而不是安全功能。

  • 类似Heartbleed的问题,适度的防御:通过mmap在双方的警卫页面上分配您的记忆:首先mmap超过您需要的2页,所有PROT_NONE ,然后使用mprotect创建除第一页和最后一页PROT_READ|PROT_WRITE之外的所有页面。一旦完成,就用munmap释放它。

  • 类似Heartbleed的问题,强有力的防御:分叉子进程来进行所有加密。