2015-07-28 14 views
14

Oto moja aktualna sytuacja - mam aplikację, która kompiluje kod C# jako ciąg znaków, używając CodeDom. Mam SecureString, który przechowuje hasło i zastanawiałem się, czy istnieje jakiś sposób przekazania tej zmiennej SecureString do skompilowanego kodu jako SecureString?Czy można przekazać zmienną do kodu kompilatora C#?

Oto przykładowy kod:

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); 

nie mogę znaleźć sposób, aby to zrobić i sądzę, że nie jest to faktycznie możliwe, a zamiast tego należy ewentualnie tylko przechowywać hasła w zaszyfrowanym pliku i przeczytać z tego?

+1

Piszesz exe, więc i tak chcesz umieścić w nim hasło w postaci szeregowej. To nie jest tak, że dajesz wartość uruchomionemu programowi. – GSerg

+1

(Które można wygodnie zrobić przez [dodanie zasobu] (http://stackoverflow.com/q/13666956/11683) do swojego zespołu, który zawiera zaszyfrowany obszar typu blob). – GSerg

+0

@GSerg To genialny pomysł, czy zasoby są wbudowane w rzeczywisty plik EXE, czy też będą przechowywane osobno (w oddzielnym pliku), ponieważ jeśli są przechowywane osobno, to równie dobrze mogę zaszyfrować ciąg i wysłać go do txt plik? – Jake

Odpowiedz

1

Wszystko, czego potrzebujesz, to wymyślić sposób zmiany SecureString na System.String.

już odpowiedział tutaj: How to convert SecureString to 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)); 
+3

Uważam, że OP chciał zachować ciąg bezpieczny w tym procesie. – GSerg

+1

Mam już metodę, która może to zrobić, ale nie jest hardcoding hasło bardzo zły pomysł? (i tak, jak powiedział GSerg, utrzymanie hasła w SecureString byłoby idealne) – Jake

+1

@ PhilJones - nie jest to możliwe, potrzebujesz czegoś, co jest bezpieczne w pamięci, a następnie jest potrzebne w surowym formacie, aby znów być bezpieczne. –

4

myślę, że jesteś zagubiony pojęć. Próbujesz skompilować hasło do pliku exe i uważasz, że SecureString będzie zabezpieczać twoje hasło. To nie jest to, do czego służy SecureString. Czytaj the documentation:

(SecureString) Reprezentuje tekst, który powinien być traktowane jako poufne, takie jak usuwając go z pamięci komputera, gdy nie jest już potrzebna.

SecureString będzie chronić tylko hasła w pamięci przez 1) zaszyfrowanie go, gdy jest on w pamięci, więc żadne inne aplikacje mogą go powąchać, i 2) usunięcia go z pamięci raz jesteś z nim zrobić.

Jeśli skompilujesz swoje hasło do pliku exe, haker może łatwo go pobrać, nawet jeśli jest zaszyfrowany. W rzeczywistości uzyskanie go od exe jest znacznie łatwiejsze niż uzyskanie go z pamięci. Szyfrowanie spowoduje tylko trochę trudniejsze, ale wykwalifikowany haker może nadal odszyfrować go po znalezieniu klucza. Sugestia podana przez Gsega, aby skompilować go jako zasób osadzony i twoja sugestia szyfrowania go w pliku tekstowym, będą miały ten sam problem.

Wszystko sprowadza się do klucza szyfrowania, gdzie jest przechowywany? Jeśli przechowujesz go w pliku exe (ponieważ musisz go odszyfrować), haker będzie mógł znaleźć klucz i użyć go do odszyfrowania hasła. Będziesz musiał przechowywać go poza exe w sposób, który nie jest osiągalny przez hakera. Tak więc prawdziwym problemem, który musisz przemyśleć, jest: Gdzie przechowywać klucz szyfrujący, aby aplikacja mogła go przeczytać, ale haker nie może tego zrobić?.

Teraz, gdy aplikacja pobiera klucz, teraz można odszyfrować hasło do zmiennej SecureString, aby ją zabezpieczyć w pamięci, a następnie usunąć.

Powiązane problemy