Можете ли вы передать переменную в код компилятора С#?

Здесь моя текущая ситуация. У меня есть приложение, которое компилирует код С#, взятый в виде строки, используя 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);

Я не могу найти способ сделать это, и я предполагаю, что это на самом деле невозможно, и вместо этого я должен просто сохранить пароль в зашифрованном файле и прочитать его из этого?

Ответы

Ответ 1

Я думаю, вы смущены понятиями. Вы пытаетесь скомпилировать пароль в exe файл, и считаете, что SecureString сохранит ваш пароль в безопасности. Это не то, что для SecureString. Прочтите документацию:

(SecureString) Представляет собой текст, который должен быть конфиденциальным, например, путем удаления он из памяти компьютера, когда он больше не нужен.

SecureString будет защищать только ваш пароль в памяти: 1) шифрует его, пока он находится в памяти, поэтому другие приложения не могут его обнюхать и 2) удалять его из памяти, как только вы закончите с ним.

Если вы скомпилируете свой пароль в exe, хакер может легко получить его оттуда, даже если он зашифрован. Фактически, получить его от exe намного проще, чем получить его из памяти. Шифрование будет лишь немного сложнее, но опытный хакер все еще может расшифровать его после нахождения ключа. Предложение, данное Gseg для его компиляции как встроенного ресурса и вашего предположения о его шифровании в текстовом файле, будет иметь одинаковую проблему.

Все сводится к ключу шифрования , где он хранится? Если вы храните его в exe файле (потому что вам нужно, чтобы ваше приложение расшифровывало его), тогда хакер будет быть в состоянии найти ключ и использовать его для расшифровки вашего пароля. Вам нужно будет хранить его вне exe способом, недоступным хакером. Итак, реальная проблема, о которой вам нужно подумать: Где хранить ключ шифрования, чтобы приложение могло его читать, но хакер не может?.

Теперь, когда ваше приложение извлекает ключ, теперь вы можете расшифровать пароль до переменной SecureString, чтобы защитить его, пока он находится в памяти, и затем удалите его.

Ответ 2

Ну, все, что вам нужно, - это выбрать способ изменить 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));