从内存中删除敏感信息

Posted

技术标签:

【中文标题】从内存中删除敏感信息【英文标题】:Erasing sensitive information from memory 【发布时间】:2015-02-12 17:16:18 【问题描述】:

读完this question后,我很好奇在C语言中如何做到这一点。当从另一个程序接收信息时,我们可能不得不假设内存是可写的。

我发现 this 指出可能会优化常规 memset,而 this comment 指出 memset 是错误的方法。

【问题讨论】:

我建议使用带有memset() 的易失性指针。这些不会被优化掉。 阅读了您的链接后,您怎么知道您可以删除通过操作系统(可能通过多个缓冲区)进入程序的数据?您可以确定的唯一方法是在每次关机时清理硬盘驱动器。除此之外,您可以在使用点之前加密所有敏感数据,然后将任何内存重新用于编译器不会优化的特定但无意义的任务,例如读取“lorem ipsum”文本文件并执行某些操作编译器无法推断是没有意义的。 @Igor S.K 这也是我想到的事情之一,但最终它导致阻止 memset 被优化。我不知道我是否对上面链接的 R.. 的评论过于重视,但感觉他的评论仍然适用。 @Weather Vane 你可能是对的,但我想坚持在内存中有一个数据副本并且我们有一个可写指针的情况。交换时发生的任何事情都不是我现在关心的问题。在内存中加密感觉​​不对,因为最终它只是混淆 【参考方案1】:

您提供的示例不太有效:编译器可以在检测到没有副作用并且不再使用该值时优化出变量设置操作。

因此,如果您的代码使用一些共享缓冲区,可从多个位置访问,那么 memset 将正常工作。差不多了。

不同的处理器使用不同的缓存策略,因此您可能必须使用内存屏障来确保数据(零)已从缓存到达内存芯片。

因此,如果您不担心硬件级别的细节,确保编译器无法优化输出操作就足够了。例如,memsetting 块在释放之前会被执行。

如果您想确保从所有硬件项目中删除数据,您需要检查数据缓存在您的平台上是如何实现的,并使用适当的代码来强制缓存刷新,这在多核机器上可能很重要.

【讨论】:

好吧,我并不担心有人会访问我的 CPU 缓存。只是为了确保我理解正确:您的建议归结为声明指针 volatile、memseting 和 freeing,对吗? @funkysash 这两个是替代品。 volatile 由于语言要求而禁用了许多优化。在释放前清除只是告诉编译器指针被传递到某个地方(因为它实际上并不知道free 做了什么),因此任何数据修改都无法优化。

以上是关于从内存中删除敏感信息的主要内容,如果未能解决你的问题,请参考以下文章

从subversion存储库中删除敏感信息

c# 并从内存中删除敏感数据和所有垃圾收集副本

git删除已经提交的包含敏感信息的文件(还没提交到远程仓库)

如何删除 iOS 应用程序附带的敏感信息

在自定义 JSON 堆栈中传递敏感信息

我应该以 jwt 还是纯 json 从服务器发送敏感信息?