2009-10-15 36 views

Respuesta

83

No es así. 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 mantiene allí en texto sin formato hasta la recolección de basura). Sin embargo, puede agregar caracteres a 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'); 
+18

No olvides hacer que sea solo de lectura en pantalla(); – ysrb

+3

"La combinación es' 12345' ... ¡ese es el tipo de cosas que un idiota tiene en su equipaje! " –

+0

Todo lo que veo es '*****' –

4

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

No puede simplemente cambiar todas sus cadenas para asegurar cadenas 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 descifra durante un período de tiempo muy corto, borrando la memoria después de que se haya realizado una operación.

Me atrevería a decir que puede tener algunos problemas de nivel de diseño para tratar antes de preocuparse por la seguridad de sus cadenas de aplicaciones. Danos más información sobre lo que tratas de hacer y podremos ayudarlo mejor.

+1

sólo quiero usarlo para establecer una contraseña para ProcessStartInfo y ejecutar mi exe como otro usuario. . Eso funcionó para mí ... – Nila

+2

Mi aplicación está asegurada ejecutándola en un sistema seguro. No me podría importar menos que esta cadena en particular sea encriptada en la memoria. Hay información mucho más vital sobre este sistema de la que preocuparse si alguna vez se compromete. SecureString es simplemente requerido por una API de Microsoft que mi programa necesita utilizar. Se implica que el desarrollador considere su propio caso de uso y determine si la conversión de cadenas a SecureStrings es una operación válida en contexto. – Dan

3

estoy de acuerdo con Spence (1), pero si lo estás haciendo para el aprendizaje o de prueba pourposes, se puede utilizar un foreach en la cadena, añadiendo cada char a la SecureString utilizando el método AppendChar .

39

debajo método ayuda a convertir la serie para asegurar la cadena

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; 
} 
+11

+1, pero tenga en cuenta que al pasar la contraseña como un parámetro de cadena se crea una instancia de cadena desencriptada en la memoria administrada y se frustra el propósito de 'SecureString' en primer lugar. Simplemente señalando esto para las personas futuras que vengan y usen este código. – Cody

+5

@Cody Es cierto, y es un buen punto, pero a muchos de nosotros no nos importa si SecureString es seguro o no y solo lo estamos usando porque algunos API de Microsoft lo requieren como parámetro. – Dan

11

Usted puede seguir este:

string password = "test"; 
SecureString sec_pass = new SecureString(); 
Array.ForEach(password.ToArray(), sec_pass.AppendChar); 
sec_pass.MakeReadOnly(); 
6
unsafe 
{ 
    fixed(char* psz = password) 
     return new SecureString(psz, password.Length); 
} 
5

Aquí es un truco barato LINQ.

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

Esta respuesta es un ejercicio consiste en ver cuántas copias temporales del texto sin formato se pueden generar en un solo disparo –

2

Si desea comprimir la conversión de un string a un SecureString en un comunicado LINQ se puede expresar 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 LINQ no mejora la seguridad de esta solución. Sufre del mismo defecto que cualquier conversión de string a SecureString. Mientras el original string permanezca en la memoria, los datos son vulnerables.

Dicho esto, lo que la afirmación anterior puede ofrecer es mantener unida la creación del SecureString, su inicialización con datos y finalmente bloquearlo para que no se modifique.

3

sin LINQ de fantasía, no sumando todos los caracteres a mano, simplemente y simple:

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

incluso más elegante, sin necesidad de definir una variable – bigworld12

+0

aquí hay un trazador: 'var sc = new SecureString(); foreach (char c en "foo") sc.appendChar (c); ' – bigworld12

44

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

1. Cadena a SecureString

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

2.SecureString a cadena

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

Aquí está el link

+1

¡Esta es la mejor solución para el caso de uso más común! – Dan

+3

No tiene sentido utilizar 'SecureString' si su código crea un objeto' string' con el valor que desea proteger. El objetivo de 'SecureString' es evitar tener la cadena en la memoria administrada, por lo que un atacante que examine esa memoria puede detectar el valor que desea ocultar. Dado que el constructor 'NetworkCredential' que está llamando requiere una cadena, ese no es el camino a seguir ... Claro, su código es una forma fácil de convertir a un SecureString y desde él, pero usarlo hace que su código sea tan seguro como usar un simple 'cadena' –

0

Los siguientes 2 extensiones debe hacer el truco:

  1. Para una matriz 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.

2

se puede utilizar este script sencillo

private SecureString SecureStringConverter(string pass) 
{ 
    SecureString ret = new SecureString(); 

    foreach (char chr in pass.ToCharArray()) 
     ret.AppendChar(chr); 

    return ret; 
} 
+0

Esta respuesta [se publicó hace 15 meses] (https://stackoverflow.com/a/38326325/11683). Realmente no hubo necesidad de publicarlo de nuevo. – GSerg

0

Un enfoque más sencillo que se puede utilizar:

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