加密敏感数据的内存安全 我在C++中编写了一个服务器,它将处理敏感数据将被发送的安全连接。

加密敏感数据的内存安全 我在C++中编写了一个服务器,它将处理敏感数据将被发送的安全连接。,c++,linux,cryptography,C++,Linux,Cryptography,目标是永远不要将数据以未加密的形式保存在内存之外的任何位置,并将其保存在内存中定义的空间中(不再需要后将被覆盖) 分配一大块内存并使用它存储敏感数据是否足够,并确保没有数据泄漏?您想要的是将一些内存区域锁定到RAM中。请参阅a的手册中有关mlock(2)的手册页: mlock()是否是保护敏感数据的正确方法也是有争议的 信息。根据POSIX的说法,mlock()可以创建一个页面(对于实时应用程序很有用),但它不是 在交换中(对安全应用程序有用)。可能是加密的 交换分区(或不交换分区)是更好的解决

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


分配一大块内存并使用它存储敏感数据是否足够,并确保没有数据泄漏?

您想要的是将一些内存区域锁定到RAM中。请参阅a的手册中有关
mlock(2)
的手册页:

mlock()
是否是保护敏感数据的正确方法也是有争议的 信息。根据POSIX的说法,mlock()可以创建一个页面(对于实时应用程序很有用),但它不是 在交换中(对安全应用程序有用)。可能是加密的 交换分区(或不交换分区)是更好的解决方案

但是,Linux确实讨论了安全应用程序,并专门讨论了安全应用程序。它还提到:

但请注意,笔记本电脑和某些台式计算机上的挂起模式将 将系统RAM的副本保存到磁盘,而不考虑内存锁定


为什么不使用SELinux?那么,除非您告诉流程可以访问其他内容,否则流程无法访问其他内容

我认为,如果你要保护一个处理敏感数据的程序,你应该从使用一个安全的操作系统开始。如果操作系统不够安全,那么您的应用程序将无法修复这一问题

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

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

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

  • 不管怎样,任何被回收的页面以及后来被分配给另一个进程的页面都会被操作系统归零(每个现代操作系统都会这样做)
  • 只要某些数据在计算机上,你就必须假设有人能够以某种方式窃取它
  • 在操作系统和您自己的代码中有比您所知道的更多的漏洞(这种情况发生在最好的程序员身上,并且一次又一次地发生)
在试图阻止某人窃取敏感数据时,存在着无数的顾虑,这绝非易事。加密数据,尽量不存在任何明显的漏洞,并且尽量避免最愚蠢的错误,这是你将得到的。除此之外,没有什么是真正安全的,因为对于你计划的每N件事,就有一件N+1的事


以我妻子的工作笔记本电脑为例。在公司里安装机器的实习生(至少我猜他是个实习生)采取一切可能的措施,在偏执狂模式下配置一切,以确保计算机上的数据不被窃取,工作变得尽可能痛苦。你最终得到的是一台受bitlocker保护的计算机,它甚至需要3个密码才能启动,而且你几乎什么也不能做,还有一个屏幕保护程序,它在你每次拿起电话忘记晃动鼠标时都会锁定工作站。同时,这台超级安全的计算机有一个已启用的firewire端口,通过该端口,每个人都可以在无需密码的情况下读取和写入计算机内存中的任何内容。

这是一个模糊的问题。你是否担心另一个进程窥探你服务器的内存?在应用程序处理完数据后,应该没有人能够访问它。如果它在内存中或更糟的地方(硬盘或网络)泄漏,那将是一场灾难。。。我不是问应用程序的安全性,只是问内存:)@Sam看一下windows pagefile,例如…+1我想听听人们对此有什么看法。定时攻击、查看机器功耗、使用
ptrace
尝试读取/写入进程内存等漏洞都会使正确处理加密数据变得非常困难。还要注意DMA控制器,它可以读取物理内存中的任何位置。在许多计算机上,这包括火线设备。