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

C++ 如何分配单独的内存来存储机密数据?,c++,linux,C++,Linux,我想知道,是否有可能在某个库中分配一个单独的内存区域,使得使用该库的应用程序无法直接访问它 假设此库公开了一个类,该类需要机密数据才能运行。例如,下面的类,其中该类的实例包含机密访问令牌,这将允许恶意用户无需登录即可访问数据库 class Session { public: Session(const Database *database, const std::string& name) : username(name), login_expires(-1), db(databas

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

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

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的会话实例(其中用户当前已登录)时,我可以通过将a&s转换为字符指针来提取accesstoken

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

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;
};
如果类会话是这样声明的,那么终端应用程序就不再可能访问机密数据,因为它不再存储在会话实例本身中


问题:

我必须以这样一种方式存储机密数据,即不能在最终应用程序中仅使用指针算法访问机密数据

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

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


有什么方法可以做到这一点吗?

我认为您没有任何机会以其他函数无法在同一过程中访问的方式存储数据。通过将数据存储在某个文件/thread_局部变量中,您可以使存储变得更加困难,但同样,这只会隐藏数据,而不会保护数据。

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