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

Dre*_*rew 6 c unix linux

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

我看过一些事情:

  • TRESOR(不是BSD便携式)
  • Akamai的"安全堆"
  • 大卫肖的秘密
  • 使用mlock禁止分页
  • 只需使用malloc,不要担心.粗略阅读表明这可能是LibreSSL所做的.

有什么建议?

R..*_*R.. 5

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

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

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

  • 像Heartbleed一样的问题,适度的防御:通过mmap两侧的防护页面分配你的记忆:mmap比你需要的更多2页,全部用PROT_NONE,然后使用mprotect除了第一页和最后一页之外的所有页面PROT_READ|PROT_WRITE.munmap一旦完成它就立即释放它.

  • 像Heartbleed一样的问题,强有力的防御:分叉一个子进程来做所有的加密.