【问题标题】:Memory management in C when using gcry_malloc_secure使用 gcry_malloc_secure 时 C 中的内存管理
【发布时间】:2013-02-04 10:21:10
【问题描述】:

我正在使用GNU/Linux下的libgcrypt 1.5.0开发一个小型aes256-cbc文件加密软件。

我对交换到磁盘的安全内存和数据存有疑问。

假设我有这个代码:

char *crypto_key;
crypto_key = gcry_malloc_secure(256);

这两件事同时做有用和必要吗?

1) 不允许该内存被分页: mlock(crypto_key, size)

2) 为了防止信息被写入核心转储:

struct rlimit limit;
limit.rlim_cur = 0;
limit.rlim_max = 0;
if (setrlimit(RLIMIT_CORE, &limit) != 0) {
    /* Handle error */
}

【问题讨论】:

  • 据我所知,安全内存应该被锁定。

标签: c memory-management libgcrypt


【解决方案1】:

在不阻止将内存区域写入页面文件(或代码转储)的情况下,敏感数据(密钥)可能会留在磁盘上,并被不打算查看/拥有数据的人发现。是否必要/有用取决于应用程序。不这样做可能会使密钥或未加密的数据长时间留在笔记本电脑的硬盘上,然后有人可以通过窃取笔记本电脑从中获取密钥/数据。对于物理安全计算机上的私人使用,可能没有必要(但仍然是一种很好的做法,因为最好为任何事情做好准备)。

您不需要自己锁定内存(分配的 crypto_key),libgcrypt 会为您完成(假设您正确初始化了库)。一旦释放,它还应该清除/覆盖内存。

防止核心转储可能是矫枉过正,因为原始未加密文件很可能在机器上仍然可用,连同密钥。取决于您尝试实现的安全级别。如果你没有转储文件,你也不会忘记删除它。

通常,机器的用户/管理员应将机器配置为不进行核心转储,工具程序不应更改设置(如果没有提升的权限,甚至可能无法更改)。

【讨论】:

  • 所以,总而言之,第 1 步和第 2 步都不需要,对吧?
  • 对,不需要。但是你也应该注意原始的未加密文件,可能在最终删除之前覆盖它几次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2010-09-06
  • 2018-12-17
  • 2013-04-13
  • 2011-06-28
相关资源
最近更新 更多