我在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 */
}
答案 0 :(得分:1)
在不阻止将内存区域写入页面文件(或代码转储)的情况下,敏感数据(密钥)可能会被写入磁盘并由不打算查看/拥有数据的人找到。它是否必要/有用取决于应用。不这样做可能会在笔记本电脑的硬盘驱动器上长时间留下秘密密钥或未加密的数据,然后有人可以通过窃取笔记本电脑来获取密钥/数据。对于在物理安全的计算机上私人使用,可能没有必要(但仍然是良好的做法,因为最好为任何事情做准备)。
您不需要自己锁定内存(已分配的crypto_key),libgcrypt会为您执行此操作(假设您已正确初始化了库)。一旦释放,它也应该清除/覆盖内存。
防止核心转储可能过度杀伤,因为原始的未加密文件可能仍在计算机上以及密钥上可用。取决于您尝试实现的安全级别。如果您没有转储文件,也不会忘记删除它。
通常,机器的用户/管理员应该将机器配置为不进行核心转储,工具程序不应该是那些应该更改设置的程序(如果没有提升权限,甚至可能无法执行)。