从我的WPF应用程序和C#库跟踪内存中的敏感数据

从我的WPF应用程序和C#库跟踪内存中的敏感数据,c#,security,debugging,securestring,C#,Security,Debugging,Securestring,我一直在尝试使用我的两个C#库和一个WPF应用程序,用SecureString替换纯文本、字符串密码。在某些地方,我确实需要将SecureString转换回常规字符串,以便与我无法控制的其他库/web服务进行交互,但我希望尽量减少这样做的次数。我也在努力学习如何正确地做这件事。有没有一种简单的方法可以监控代码中哪些字符串最终在内存中浮动?我想知道我的代码中有多少弱点,可以说,关于内存中以明文形式存在的敏感数据。您可以检查的一件事是,通过向库中添加弱引用,您的明文密码是否保持有效,并查看它需要多长

我一直在尝试使用我的两个C#库和一个WPF应用程序,用
SecureString
替换纯文本、字符串密码。在某些地方,我确实需要将
SecureString
转换回常规字符串,以便与我无法控制的其他库/web服务进行交互,但我希望尽量减少这样做的次数。我也在努力学习如何正确地做这件事。有没有一种简单的方法可以监控代码中哪些字符串最终在内存中浮动?我想知道我的代码中有多少弱点,可以说,关于内存中以明文形式存在的敏感数据。

您可以检查的一件事是,通过向库中添加弱引用,您的明文密码是否保持有效,并查看它需要多长时间才能消失。您可以随时检查强制垃圾收集是否有帮助。但避免在生产代码中执行强制GC,特别是在服务器上


但这只是问题的一半:这主要取决于其他库对字符串的处理。如果他们将密码嵌入其他字符串中,并将其保持引用状态,则在内存中它将不受保护,而您无法控制它

因此,如果我的测试密码是“pass123”,我会在“pass123”中添加一个WeakReference(),因为字符串在.NET中是不可变的,如果其他代码使用“pass123”。。。等等,我怎么处理WeakReference?在调试器里放一块手表?是的,通常是这样。在库调用之后,将ref放入weakref中的字符串,将原始字符串ref设置为null,然后可以尝试全局强制GC是否会使其消失。如果导致它消失,您知道库至少不会让您的秘密字符串永久保持活动状态。下一步可能是每隔几秒/分钟在调试构建中测试字符串被垃圾回收所需的时间。您可以保留weakref,并在它的目标变为null时进行检查。通常,最初保持字符串活动的时间越长,之后收集字符串所需的时间就越长。如果您的api调用需要很长时间或经常触发GC,.net可能已经确定您的字符串似乎是持久的,并且只有在发生完全GC时才会销毁它。在GUI应用程序中,您可以自己触发这些事件,例如当您的应用程序处于空闲状态时。