你能把变量传递给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);
我找不到这样做的方法,我想这实际上是不可能的,相反,我应该可能只是将密码存储在加密文件中并从中读取它?
我认为你对这些概念感到困惑。你试图将密码编译成一个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));