Aquí está mi situación actual: tengo una aplicación que compila el código C# tomado como una cadena, usando CodeDom. Tengo un SecureString que almacena una contraseña y me preguntaba si habría alguna forma de pasar esa variable SecureString al código compilado como SecureString.
Aquí hay un código de ejemplo:
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);No puedo encontrar una manera de hacer esto e imagino que esto no es realmente posible y, en cambio, ¿debería almacenar la contraseña en un archivo cifrado y leerla desde allí?
Creo que estás confundido acerca de los conceptos. Está intentando compilar la contraseña en un archivo exe y cree que SecureString mantendrá segura su contraseña. Eso no es para lo que es SecureString . Lea la documentación :
(SecureString) Representa texto que debe mantenerse confidencial, por ejemplo, eliminándolo de la memoria de la computadora cuando ya no se necesite.
SecureString solo protegerá su contraseña en la memoria 1) encriptándola mientras está en la memoria para que ninguna otra aplicación pueda detectarla y 2) eliminándola de la memoria una vez que haya terminado con ella.
Si compila su contraseña en un exe, un pirata informático puede obtenerla fácilmente incluso si está encriptada. De hecho, obtenerlo del exe es mucho más fácil que obtenerlo de la memoria. Cifrarlo solo lo hará un poco más difícil, pero un hacker habilidoso aún puede descifrarlo después de encontrar la clave. La sugerencia dada por Gseg de compilarlo como un recurso incrustado y su sugerencia de encriptarlo en un archivo de texto, ambos tendrán el mismo problema.
Todo se reduce a la clave de cifrado, ¿dónde se almacena? Si lo almacena en el archivo exe (porque necesita que su aplicación pueda descifrarlo), el hacker podrá encontrar la clave y usarla para descifrar su contraseña. Deberá almacenarlo fuera del exe de una manera que no sea accesible para el pirata informático. Entonces, el problema real en el que debe pensar es: ¿Dónde almacenar la clave de cifrado para que la aplicación pueda leerla, pero el pirata informático no puede? .
Ahora, cuando su aplicación recupera la clave, puede descifrar la contraseña en una variable SecureString para protegerla mientras está en la memoria y eliminarla después.
Bueno, todo lo que necesita es encontrar una manera de cambiar SecureString a System.String .
Ya respondido aquí: ¿Cómo convertir SecureString a 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));