你能把变量传递给c#编译器代码吗?

本文关键字:编译器 代码 变量 | 更新日期: 2023-09-27 18:05:06

这是我目前的情况-我有一个应用程序,它编译c#代码作为一个字符串,使用CodeDom。我有一个存储密码的SecureString,我想知道是否有任何方法将该SecureString变量传递到作为SecureString的编译代码中?

下面是一些示例代码:
SecureString securePassword = getSecurePass();
string codeString =
        @"using System;
        using System.Security;
        namespace SomeProgram
        {
            class MyClass
            {
                static void Main(string[] args)
                {
                    SecureString securePass = new SecureString();
                    // somehow set this equal to the securePassword variable
                }
            }
        }";

// Compiler Code
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
string outFile = "output.exe"; 
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.OutputAssembly = outFile;
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, codeString);

我找不到这样做的方法,我想这实际上是不可能的,相反,我应该可能只是将密码存储在加密文件中并从中读取它?

你能把变量传递给c#编译器代码吗?

我认为你对这些概念感到困惑。你试图将密码编译成一个exe文件,你认为SecureString会保护你的密码安全。这不是SecureString的作用。阅读文档:

(SecureString)表示应该保密的文本,例如通过删除当不再需要时,从计算机内存中取出。

SecureString只会保护你的内存密码,1)加密它,而它是在内存中,所以没有其他应用程序可以嗅探它,2)从内存中删除它,一旦你完成了它。

如果你把你的密码编译成一个exe,黑客可以很容易地从那里得到它,即使它是加密的。事实上,从exe中获取它比从内存中获取它要容易得多。加密它只会让它变得更难,但一个熟练的黑客仍然可以在找到密钥后解密它。Gseg建议将其编译为嵌入式资源,而您建议将其加密在文本文件中,两者都会有相同的问题。

这一切都归结为加密密钥,它存储在哪里?如果你将其存储在exe文件中(因为你需要你的应用程序能够解密它),那么黑客将能够找到密钥并使用它来解密你的密码。您需要将其存储在exe之外,以一种黑客无法访问的方式。所以你需要考虑的真正问题是:在哪里存储加密密钥,以便应用程序可以读取它,但黑客不能?.

现在,当你的应用程序检索密钥,那么现在你可以解密密码到一个SecureString变量,以保护它,而它是在内存中,然后删除它。

你需要做的就是想办法把SecureString改成System.String

这里已经回答了:如何将SecureString转换为System.String?

string codeString =
    String.Format(@"using System;
    using System.Security;
    namespace SomeProgram
    {
        class MyClass
        {
            static void Main(string[] args)
            {
                SecureString securePass = new SecureString();
                {0} // use it the way u like
            }
        }
    }", SecureStringToString(securePassword));