加密敏感数据的内存安全性

时间:2011-03-20 18:28:33

标签: c++ linux cryptography

我正在用c ++编写服务器来处理将发送敏感数据的安全连接。

目标永远不会以未加密的形式将数据保存在内存之外的任何位置,并将其保留在内存中的已定义空间(在不再需要之后被覆盖)

会分配一大块内存并使用它来存储敏感数据就足够了并确保没有数据泄漏?

4 个答案:

答案 0 :(得分:8)

来自tool that handles passwords的手册:

  

mlock()是否是保护敏感的正确方法也存在争议   信息。根据POSIX,mlock() - 页面guarantees that it is in memory(对实时应用程序有用),而不是它不是   在交换中(对安全应用程序很有用)。可能是加密的   交换分区(或没有交换分区)是一个更好的解决方案。

但是,Linux guarantee that it is not in the swap并专门讨论了安全应用程序。它还提到:

  

但请注意笔记本电脑和某些台式电脑上的挂起模式会   无论内存锁定如何,都将系统RAM的副本保存到磁盘。

答案 1 :(得分:3)

为什么不使用SELinux?然后没有进程可以访问其他东西,除非你告诉它。

我认为如果您要保护处理敏感数据的程序,则应首先使用安全的操作系统。如果操作系统不够安全,那么您的应用程序无法解决此问题。

也许在使用SELinux时,您不必在应用程序中执行任何特殊操作,从而使您的应用程序更小,更简单,更安全?

答案 2 :(得分:2)

你想要的是将一些内存区域锁定到RAM中。请参阅mlock(2)的联机帮助页。

答案 3 :(得分:2)

锁定内存(或者,如果您使用Linux,使用大页面,因为这些无法被分页)是一个良好的开端。除了所有其他考虑因素之外,这至少不会以不可预测的方式将明文写入硬盘。

不再需要时覆盖内存不会造成伤害,但可能无用,因为

  • 任何被回收并稍后被提供给另一个进程的页面都将被操作系统归零(每个现代操作系统都会这样做)
  • 只要某些数据在计算机上,您必须假设某人能够以某种方式窃取它
  • 在操作系统和你自己的代码中有比你所知更多的漏洞(这种情况发生在最好的程序员身上,而且一次又一次地发生)

在试图阻止某人窃取敏感数据时,有无数的担忧,这绝不是一件容易的事。加密数据,尽量不要有任何明显的漏洞,并试图避免最愚蠢的错误,就像你会得到的一样好。除此之外,没有什么是真正安全的,因为对于你计划的每一件事,都存在一个N + 1的东西。

以我妻子的工作笔记本电脑作为游行示例。在他们公司设置机器的实习生(至少我猜他是实习生)采取一切可能的措施,并以偏执模式配置所有内容,以确保计算机上的数据不会被盗,并且工作变得像以下一样严峻考验可能。你最终得到的是一台受bitlocker保护的计算机,它可以获得3个密码甚至启动,并且几乎什么都不做,以及每次拿起电话并忘记摇动鼠标时锁定工作站的屏幕保护程序。同时,这款超级安全的计算机有一个启用的火线端口,每个人都可以在没有密码的情况下在计算机的内存中读写任何内容。