C# 如何为只读初始化SecureString

C# 如何为只读初始化SecureString,c#,arrays,char,securestring,C#,Arrays,Char,Securestring,我想创建一个变量,一个安全的变量,在我的代码中或多或少是一个常量。我已经研究过如何使用System.Security.SecureString,看起来它可能是一张罚单,因为我不想让用户发现这个密码。唯一的问题是初始化它。在大多数情况下,似乎SecureString最好由用户按键设置。我不要这个。我的一个选择是这样的: unsafe public static void Main() { SecureString testString; // Define the s

我想创建一个变量,一个安全的变量,在我的代码中或多或少是一个常量。我已经研究过如何使用System.Security.SecureString,看起来它可能是一张罚单,因为我不想让用户发现这个密码。唯一的问题是初始化它。在大多数情况下,似乎SecureString最好由用户按键设置。我不要这个。我的一个选择是这样的:

unsafe public static void Main()
   {
      SecureString testString;
      // Define the string value to assign to a new secure string.
      char[] chars = { 't', 'e', 's', 't' };

      // Instantiate a new secure string.
      fixed(char* pChars = chars)
      {
         testString = new SecureString(pChars, chars.Length);
      }
      // Display secure string length.
      Console.WriteLine("The length of the string is {0} characters.", 
                        testString.Length);
   }

唯一的问题是,字符数组“t”、“e”、“s”、“t”可能在编译后仍打包在内存中。有没有什么好方法可以在编译前将SecureString的值设置为常量并对该值进行置乱?

您可以将chars中的每个条目设置为某个强随机值,以从动态内存中删除该值。但是,字符串仍将存在于可执行文件中。

您想实现什么?您想存储“机密”密码以隐藏某些功能吗?一旦代码被泄露/发现,你的“安全性”就消失了!一个更好的解决方案,但仍然不是很好,就是拥有你的应用程序。打电话回家。源代码不必泄露,只要分发可执行文件就足够了!反编译可能就足够了。。。或者通过调试器运行它。你发送给不受信任的人的秘密不再是秘密。根本原因是我必须写一份x509certificate2来存档,并用密码保护它。然后我用同样的密码把它读了回来。你的意思是你必须把私钥写入一个文件并用密码保护它吗?您不应该对封装在证书中的公钥进行加密,因为它是公开的,任何人都可以使用。