1

我正在使用 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 */
}
4

1 回答 1

1

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

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

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

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

于 2013-02-04T10:53:42.487 回答