c# - 内存堆安全 : String garbage collection

标签 c# .net security garbage-collection clr

我最近一直在为我的公司进行安全代码审查,并使用名为 Fortify360 的工具。它将识别代码的许多问题并描述问题。它提出了一个有趣的问题,我没有找到任何其他信息如下:

“存储在内存中的敏感数据(如密码)如果存储在托管的String对象中,可能会泄露。String对象没有固定,所以垃圾收集器可以随意重新定位这些对象,并留下几个副本在内存中。默认情况下,这些对象未加密,因此任何可以读取进程内存的人都可以看到内容。此外,如果进程内存换出到磁盘,则字符串的未加密内容将被写入到交换文件。最后,由于 String 对象是不可变的,从内存中删除 String 的值只能由 CLR 垃圾收集器完成。垃圾收集器不需要运行,除非 CLR 内存不足,所以有无法保证何时进行垃圾回收。在应用程序崩溃的情况下,应用程序的内存转储可能会泄露敏感数据。”

我理解的所有这些都是有道理的,并且在我对这个问题的研究中是非常标准的。

问题是:我该如何解决这个问题?假设有问题的一个或多个类不能从 iDisposable 继承(非常大的应用程序,并且在有问题的字符串之后很久就需要该类)。是否有手动内存管理的替代方法来处理特定字符串而不调用垃圾收集器 GC.Collect()??

提前感谢您的帮助。

亚历克斯

最佳答案

如果你想避免这种情况,你需要使用 System.SecureString ,这是 IDisposable,用于保存敏感数据,仅在所需的最短时间内保存。

具有讽刺意味的是,MSDN 示例代码没有显式地使用 封装Dispose 实例。

关于c# - 内存堆安全 : String garbage collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188659/

相关文章:

vb.net - .Net - 查找所有联网计算机名称及其共享文件夹

c# - 多项目解决方案中的事件驱动设计

java - 如何在没有 STOMP 的情况下使用支持 Spring Websocket 的 Spring Security?

java - 过期 session 出现 NullPointerException

c# - LaunchFullTrustProcessForCurrentAppAsync 的返回码

c# - 如何从控制台读取连续的输入行以用于 Add() 方法?

c# - 从 ServiceHost 获取端口号

javascript - 如何安全地(通过适当的身份验证)与客户端上的第 3 方 api 通信?

c# - MVVM ComboBox SelectedIndex 与 SelectedItem

c# - 尝试使用 JustMock 对事件进行单元测试