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

时间:2016-05-07 17:44:05

标签: c++ linux

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

让我们说这个库暴露了一个类,它需要机密数据才能运行。例如,以下类,其中此类的实例包含机密访问令牌,允许恶意用户无需登录即可访问数据库。

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用户无法将所有内存转储到磁盘并进行搜索,但这不是我想实现的目标。

我希望在我的库中有一个私有内存空间,这样一个普通访问权限的普通用户空间应用程序必须使用我的界面来处理这些受限制的资源。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

我不相信您有可能以同一过程中其他功能无法访问的方式存储数据。您可以通过将数据存储在某个文件/ thread_local变量中来加强,但同样,这只会隐藏数据,而不是保护数据。