带有 SecureString 的配置实际上安全吗?

Gre*_*reg 5 c# .net-core

在我的一次代码审查中,我偶然发现了一个有趣的SecureString. 从逻辑上讲,将值隐藏在内存中是有好处的,但我的理解IConfiguration是,当通过ConfigurationBuilder副本注入和构建时,内存中已经存在以供使用。因此,SecureString虽然隐藏了明文值,但配置访问会自动否定密文。

我的想法是否正确,真的价值是不安全的,甚至不应该使用,SecureString因为它开始不安全 -

public class Sample
{
     private readonly SecureString secret;
     public Sample(IConfiguration configuration) => secret = new NetworkCredentials(String.Empty,
          configuration.GetSection("Api:Credentials")["secret"]).SecurePassword;
}
Run Code Online (Sandbox Code Playgroud)

Ath*_*ras 1

基本上在文档中提到:

总体而言,SecureString 比 String 更安全,因为它限制了敏感字符串数据的暴​​露。但是,这些字符串仍然可能会暴露给任何有权访问原始内存的进程或操作,例如在主机上运行的恶意进程、进程转储或用户可查看的交换文件。建议的替代方案是使用存储在进程外部的凭据的不透明句柄,而不是使用 SecureString 来保护密码。

在某些平台上它甚至没有实现。它甚至在某些时候在.net框架中变成了字符串,那么为什么它会在那里呢?使用它有意义吗?

对你的评论:

我的想法是否正确,实际上该值是不安全的,甚至不应该使用 SecureString 因为它一开始就不安全-

使用它确实有意义。认为该值 100% 安全是没有意义的,它只是增加了额外的安全层。

它确实限制了暴露,这是我们在安全编码时应该努力实现的目标。

使用它的一些完全有效的理由可以在这个优秀的答案中找到:Is SecureString 在 C# 应用程序中是否实用?

我能想到的另一种情况是:如果您使用某种远程密钥存储(例如azure key Vault ),那么使用它就更有意义了。