c# - 可以将变量传递给 C# 编译器代码吗?

标签 c# compiler-construction codedom

这是我目前的情况 - 我有一个使用 CodeDom 将 C# 代码编译为字符串的应用程序。我有一个存储密码的 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);

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

最佳答案

我认为您对这些概念感到困惑。您正在尝试将密码编译成一个 exe 文件,并且您认为 SecureString 将确保您的密码安全。这不是 SecureString 的用途。阅读the documentation :

(SecureString) Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed.

SecureString 只会通过以下方式保护您的内存中密码:1) 在内存中加密它,这样其他应用程序就无法嗅探它,以及 2) 一旦您将其从内存中删除完成它。

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

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

现在,当您的应用程序检索 key 时,您现在可以将密码解密为 SecureString 变量,以便在它位于内存中时对其进行保护,然后将其删除。

关于c# - 可以将变量传递给 C# 编译器代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31682070/

相关文章:

c# - 使用 CodeDom 编译

c# - 使用统一容器 : "The underlying provider failed on Open" 具有连接字符串的 EF 多个构造函数

c# - 属性更改时未引发 BindingList.ListChanged 事件

c - 编译器警告消息

c - 提前编译器如何确定优化的程度?

JavaCompiler 无法在 Jar 中运行

c# - 为简单的 XML 文件转换器使用太多内存

c# - Corel 绘图 API (Java/C#)

c# - 在 CodeObjectCreateExpression 中分配对象的属性值

asp.net - 无法获取要构建的 CodeDom dll,程序集不匹配