c# .net security securestring

c# - Convertir cadena en SecureString



.net security (14)

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

Cómo convertir String a SecureString ?


Estoy de acuerdo con Spence (+1), pero si lo haces para aprender o probar pourposes, puedes usar un foreach en la cadena, añadiendo cada char a la cadena de seguridad usando el método AppendChar.


Las siguientes 2 extensiones deberían hacer el truco:

  1. Para una matriz de caracteres

    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 por la recomendación de AppendChar .


Puedes seguir esto:

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


Si desea comprimir la conversión de una string a un SecureString en una declaración LINQ , puede expresarlo 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 del mismo defecto 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 afirmación anterior puede ofrecer es mantener unida la creación de SecureString , su inicialización con datos y, finalmente, bloquearlo para que no se modifique.


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 pueden estar en una aplicación donde, por cualquier razón, justificada o no, no están particularmente preocupadas por tener una copia temporal de la contraseña se sienta en el montón como una cadena con capacidad GC, pero tienen que usar una API que solo acepta objetos SecureString . Entonces, usted tiene una aplicación donde no le importa si la contraseña está en el montón, tal vez es de uso interno solamente y la contraseña solo está allí porque es requerida por los protocolos de red subyacentes, y encuentra que esa cadena donde está la contraseña se almacena no se puede usar, por ejemplo, para configurar un espacio de ejecución de PowerShell remoto, pero no existe una sola línea directa sencilla para crear ese SecureString que necesita. Es un inconveniente menor, pero probablemente valga la pena garantizar que las aplicaciones que realmente necesitan SecureString no SecureString los autores a utilizar intermediarios System.String o System.Char[] . :-)


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 link


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


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


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.


a continuación el método ayuda a convertir cadena a 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 usar este script simple

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


sin linq de lujo, sin agregar todos los caracteres a mano, simplemente y simple:

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


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