gpt4 book ai didi

c++ - 将解密后的数据暂存在内存中

转载 作者:太空狗 更新时间:2023-10-29 12:40:47 27 4
gpt4 key购买 nike

背景

我正在使用原生 C++11 开发一个简单的应用程序,它使用 Microsoft 的 Cassablanca REST 框架与各种远程端点进行通信。为此,我必须使用目标 API 提供的一些 secret 对各种请求进行加密签名。通过链接 Cassablanca,我已经有了 OpenSSL,所以实际的加密相当简单。

现在,棘手的部分是如何存储 secret 本身。我的计划是使用来自用户大脑的对称 key (读取:密码)对包含所有好东西的 JSON 文件进行 AES 加密,这样它就不必存储在磁盘上。

问题

在应用程序执行期间将解密的 secret 存储在内存中的安全方法是什么?这不是另一个“我如何将 secret 存储在磁盘上以便用户不必做什么”的问题。

我最担心的是有人能够从外部检查我的应用程序的内存并找到包含好东西的适当区域。我知道 Windows 提供了 credstores 和 protected 内存,但是我在 Linux 上,如果可能的话,我更喜欢与平台无关的解决方案。这也很有可能会部署到 VM 集群,因此 protected 内存可能只能购买有限的保证(尽管总比没有好)。

最后,我知道任何密码系统都可以通过足够多的金钱+时间或足够大的橡胶软管来破解。话虽这么说,我仍然希望尽可能安全,就像 Good™ 编码实践中的练习一样。

我的约束是:

  • 必须能够访问 secret 以快速签署各种请求。毫秒在这里很重要,但如果安全性真正得到改善,我愿意接受减速。

  • 我希望尽可能少地使用外部库,并尽可能使用原生 C++11。我觉得这应该可以用我已有的东西来实现(Cassablanca,它需要 OpenSSL、Boost、libcrypt)。

  • 最后,它应该能够容纳相当多的 secret /请求。我的应用领域基本上是一个巨大的并行化问题,可扩展性是关键。

我已经知道要做什么:

  • 切勿在未加密的情况下将敏感资料存储在磁盘上。这包括使用磁盘支持的容器等等。

  • 一个古老但有用的技巧:附加调试器实例以防止从外部进程进行远程调试。

  • 在没有调试符号的情况下构建并剥离最终可执行文件。

  • 尽量减少应用程序内对数据的访问,仅让真正需要它的部分访问。

  • 敏感信息不再需要时立即销毁(例如,解密完成后立即清空用户密码等)。

  • 不要相信任何人会为我清理内存。用 NULL/垃圾手动覆盖区域。

类似问题

特定于 PHP 并建议编写一些不在 PHP 中的东西来存储凭据...这正是我要解决的问题。

特定于 Android 应用程序生命周期。我已经知道我的 secret 的存储期限将是应用程序的生命周期。

最佳答案

我会有一个静态内存区域(您的应用程序中的较大缓冲区,其中包含每个应用程序启动的加密 key 。

  1. 使用加密 key 加密您所有的实时 secret
  2. 任何使用未加密 secret 的内存都被安全内存集清除。
  3. 将用于加密的内存与普通内存分开(特别新建/删除到 mmap 区域)。

这会导致......

  1. 您的 secret 不可能一目了然。这可以防止您的信息因 heartbleed 类型的错误而泄露。尽管堆的未重置区域可能会发布,但它们没有用,因为它们是加密的。
  2. 普通 View 的 secret 是短暂的。
  3. 加密的内存不会与未加密的数据相邻。

该方案保留了三个内存区域,静态的加密 secret 和部分图像内存。

一般的应用端数据——使用正常的新建/删除。

加密数据,使用自定义的new/delete,是一个mmap,不会和普通的new/delete共享地址

关于c++ - 将解密后的数据暂存在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44932578/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com