如何分配单独的内存来存储机密数据?

Posted

技术标签:

【中文标题】如何分配单独的内存来存储机密数据?【英文标题】:How to allocate seperate memory to store confidential data? 【发布时间】:2016-05-07 17:44:04 【问题描述】:

我想知道,是否可以在某个库中分配一个单独的内存区域,这样使用该库的应用程序就无法直接访问它。

假设这个库公开了一个需要机密数据才能运行的类。例如以下类,该类的实例包含机密访问令牌,这将允许恶意用户无需登录即可访问数据库。

class Session 
public:
  Session(const Database *database, const std::string& name) : username(name), login_expires(-1), db(database) 
  virtual ~Session()

  bool renew_login(const std::string& password);
private:
  const Database* db;
  long login_exiration_date;

  // confidential data:
  std::string username;      
  char confidental_accesstoken[128];
;

当我有一个名为 s 的 Session 实例时,用户当前已在其中登录,我只需将 &s 转换为字符指针即可提取访问令牌。

现在我想将这个类重新实现为以下类:

class Session 
public:
  Session(const Database *database, const std::string& name) : username(name), login_expires(-1), db(database) 
  virtual ~Session()

  bool renew_login(const std::string& password);
private:
  const Database* db;
  long login_exiration_date;

  long some_temporary_id;
;

如果像这样声明 Session 类,终端应用程序将无法再访问机密数据,因为它不再存储在会话实例本身中。

问题:

我必须以这样一种方式存储机密数据,使其不能在最终应用程序中简单地通过使用指针算法进行访问。

我知道,我无法以 root 用户无法将所有内存转储到磁盘并搜索它的方式保护数据,但这不是我想要实现的目标。

我想在我的库中拥有一个私有内存空间,这样具有普通访问权限的普通用户空间应用程序必须使用我的界面才能使用这些受限资源。

有没有办法做到这一点?

【问题讨论】:

您需要一个单独的进程来保存数据。根据定义,在同一进程中运行的任何代码都会看到相同的地址空间。 使用单独的进程,您可以在其中选择mlock您的安全内存,以防止它被交换到磁盘。这就是像 gnupg 这样的安全软件所做的。 【参考方案1】:

我不相信您有任何机会以无法被同一进程中的其他功能访问的方式存储数据。您可以通过将数据存储在某个 file/thread_local 变量中来使其更难,但同样,这只会隐藏数据,而不是保护它。

【讨论】:

以上是关于如何分配单独的内存来存储机密数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单独的 CUDA 函数中分配 GPU 内存?

递归函数的内存分配

C++。如何获得进程从一开始就分配的最大内存量?

STM32 内存分配解析及变量的存储位置

58 动态内存分配

JVM存储位置分配——java中局部变量实例变量和静态变量在方法区栈内存堆内存中的分配