我正在寻找为256位私钥分配存储空间的“最佳实践”。我想,至少,密钥不应该被分页到磁盘,并且可能还有一些其他攻击媒介需要担心(a la Hearbleed)。该解决方案必须可移植到Linux和BSD。
我看过一些事情:
有什么建议吗?
答案 0 :(得分:5)
除非您有特殊要求,否则只使用malloc
是理智的方法。它的优势在于valgrind和类似程序可以捕获使用错误,这是您可能担心的漏洞类型的主要方式之一。正如OpenSSL的惨败向我们展示的那样,尝试做一些花哨的事情并将其搞砸是一个很大的风险。
如果您的要求更高,那么这在很大程度上取决于您的使用情况。我将假设您的密钥是暂时的,否则避免将它们存储在磁盘上并没有多大意义。以下是我对特定风险的建议缓解措施:
交换到磁盘:如果您的系统需要安全防范物理攻击,则根本不应该进行交换。单独尝试使用mlock
保护特定数据是一件笑话。只需关闭交换并安装足够的内存,这是一个非问题。 mlock
应被视为实时计划功能,而不是安全功能。
类似Heartbleed的问题,适度的防御:通过mmap
在双方的警卫页面上分配您的记忆:首先mmap
超过您需要的2页,所有PROT_NONE
,然后使用mprotect
创建除第一页和最后一页PROT_READ|PROT_WRITE
之外的所有页面。一旦完成,就用munmap
释放它。
类似Heartbleed的问题,强有力的防御:分叉子进程来进行所有加密。