Convertir cadena en SecureString

¿Cómo convertir String a SecureString ?

    Usted no La razón principal para usar el objeto SecureString es evitar la creación de un objeto de cadena (que se carga en la memoria y se guarda allí en texto sin formato hasta la recolección de basura). Sin embargo, puede agregar caracteres a un SecureString agregándolos.

     var s = new SecureString(); s.AppendChar('d'); s.AppendChar('u'); s.AppendChar('m'); s.AppendChar('b'); s.AppendChar('p'); s.AppendChar('a'); s.AppendChar('s'); s.AppendChar('s'); s.AppendChar('w'); s.AppendChar('d'); 

    También hay otra forma de convertir entre SecureString y String .

    1. Cadena a SecureString

     SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword; 

    2. SecureString a String

     string theString = new NetworkCredential("", theSecureString).Password; 

    Aquí está el enlace

    El siguiente método ayuda a convertir una cadena en una cadena segura.

     private SecureString ConvertToSecureString(string password) { if (password == null) throw new ArgumentNullException("password"); var securePassword = new SecureString(); foreach (char c in password) securePassword.AppendChar(c); securePassword.MakeReadOnly(); return securePassword; } 

    Puedes seguir esto:

     string password = "test"; SecureString sec_pass = new SecureString(); Array.ForEach(password.ToArray(), sec_pass.AppendChar); sec_pass.MakeReadOnly(); 

    Voy a tirar esto por ahí. ¿Por qué?

    No puede simplemente cambiar todas sus cadenas a cadenas seguras y, de repente, su aplicación es “segura”. La cadena segura está diseñada para mantener la cadena cifrada durante el mayor tiempo posible, y solo se desencripta durante un período muy corto de tiempo, borrando la memoria después de que se haya realizado una operación en ella.

    Me atrevería a decir que es posible que tenga que lidiar con algunos problemas de nivel de diseño antes de preocuparse por asegurar las cadenas de aplicación. Danos más información sobre lo que estás tratando de hacer y podremos ayudarte mejor.

     unsafe { fixed(char* psz = password) return new SecureString(psz, password.Length); } 

    Aquí hay un truco de linq barato.

      SecureString sec = new SecureString(); string pwd = "abc123"; /* Not Secure! */ pwd.ToCharArray().ToList().ForEach(c => sec.AppendChar(c)); /* and now : seal the deal */ sec.MakeReadOnly(); 

    Estoy de acuerdo con Spence (+1), pero si lo hace para aprender o probar vertidos, puede usar un foreach en la cadena, agregando cada carácter a la secuencia de seguridad utilizando el método AppendChar.

    Sin linq de fantasía, no agregar todos los caracteres a mano, solo claro y simple:

     var str = "foo"; var sc = new SecureString(); foreach(char c in str) sc.appendChar(c); 

    Si desea comprimir la conversión de una string a SecureString en una statement LINQ , puede expresslo de la siguiente manera:

     var plain = "The quick brown fox jumps over the lazy dog"; var secure = plain .ToCharArray() .Aggregate( new SecureString() , (s, c) => { s.AppendChar(c); return s; } , (s) => { s.MakeReadOnly(); return s; } ); 

    Sin embargo, tenga en cuenta que el uso de LINQ no mejora la seguridad de esta solución. Sufre de la misma falla que cualquier conversión de string a SecureString . Mientras la string original permanezca en la memoria, los datos son vulnerables.

    Dicho esto, lo que la statement anterior puede ofrecer es mantener unida la creación de SecureString , su inicialización con datos y, finalmente, bloquearla de la modificación.

    Las siguientes 2 extensiones deberían hacer el truco:

    1. Para una matriz de char

       public static SecureString ToSecureString(this char[] _self) { SecureString knox = new SecureString(); foreach (char c in _self) { knox.AppendChar(c); } return knox; } 
    2. Y para string

       public static SecureString ToSecureString(this string _self) { SecureString knox = new SecureString(); char[] chars = _self.ToCharArray(); foreach (char c in chars) { knox.AppendChar(c); } return knox; } 

    Gracias a John Dagg por la recomendación AppendChar .

    puedes usar este simple script

     private SecureString SecureStringConverter(string pass) { SecureString ret = new SecureString(); foreach (char chr in pass.ToCharArray()) ret.AppendChar(chr); return ret; } 

    Solo quiero señalar a todas las personas que dicen: “Ese no es el punto de SecureString “, que muchas de las personas que hacen esta pregunta podrían estar en una aplicación en la que, por cualquier motivo, estén justificadas o no, no están especialmente preocupadas por ellas. tener una copia temporal de la contraseña se encuentra en el montón como una cadena SecureString GC, pero tienen que usar una API que solo acepta objetos SecureString . Por lo tanto, tiene una aplicación en la que no le importa si la contraseña está en el montón, quizás solo sea de uso interno y la contraseña solo esté allí porque es requerida por los protocolos de red subyacentes, y encuentra esa cadena donde la contraseña el almacenamiento no se puede usar para, por ejemplo, configurar un PowerShell Runspace remoto, pero no existe una línea simple y sencilla para crear el SecureString que necesita. Es un inconveniente menor, pero probablemente valga la pena para asegurarse de que las aplicaciones que realmente necesitan SecureString no SecureString los autores a usar los intermediarios System.String o System.Char[] . 🙂

    Un enfoque más fácil que se puede utilizar:

     # Take password and convert it to a secure string $mySS = "MyCurrentPassword" | ConvertTo-SecureString -AsPlainText -Force