¿Cómo convertir String
a SecureString
?
¿Cómo convertir String
a SecureString
?
Respuestas:
Usted no Toda la razón para usar el objeto SecureString es evitar crear 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');
*****
AppendChar
no se ejecuta hasta el tiempo de ejecución, por lo que esos caracteres aún se pueden leer desde el IL, ¿correcto? Tal vez algo de ofuscación en tiempo de compilación también ayudaría ... es decir, si está codificando contraseñas.
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;
Aqui esta el enlace
SecureString
si su código crea un string
objeto con el valor que desea proteger. El objetivo 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 NetworkCredential
constructor al que llama requiere una cadena, ese no es el camino a seguir ... Claro, su código es una forma fácil de convertir ay desde un SecureString, pero usarlo hace que su código sea tan seguro como usar un simplestring
SecureString
cuando trabajamos con algunas bibliotecas. Y seamos honestos aquí, si alguien está escaneando activamente la memoria de su aplicación, entonces ya ha perdido. Incluso si ha utilizado SecureString correctamente, lo que nunca he visto, habrá otros datos valiosos para extraer.
El siguiente método ayuda a convertir cadenas en cadenas seguras
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;
}
Aquí hay un truco barato de linq.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.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 encriptada durante el mayor tiempo posible, y solo se desencripta por un período de tiempo muy corto, borrando la memoria después de que se haya realizado una operación.
Me arriesgaría a decir que puede tener algunos problemas de nivel de diseño con los que lidiar antes de preocuparse por proteger las cadenas de su aplicación. Danos más información sobre lo que estás tratando de hacer y podremos ayudarte mejor.
sin linq elegante, sin agregar todos los caracteres a mano, simplemente simple y llanamente:
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
var sc = new SecureString(); foreach(char c in "foo") sc.appendChar(c);
Sólo quiero señalar a todo el pueblo diciendo: "Ese no es el punto de SecureString
", que muchas de las personas que piden esta pregunta podría ser en una aplicación en la que, por cualquier razón, justificada o no, son no particularmente preocupados acerca de tener una copia temporal de la contraseña se encuentra en el montón como una cadena compatible con GC, pero tienen que usar una API que solo acepte SecureString
objetos. Entonces, tienes una aplicación donde no te importasi la contraseña está en el montón, tal vez es solo para uso interno y la contraseña solo está allí porque es requerida por los protocolos de red subyacentes, y encuentra que esa cadena donde se almacena la contraseña no se puede usar, por ejemplo, para configurar un PowerShell remoto Runspace, pero no hay una línea sencilla y directa para crear lo que SecureString
necesita. Es un inconveniente menor - pero probablemente vale la pena para asegurarse de que las aplicaciones que realmente hacen es necesario SecureString
No tiente a los autores el uso System.String
o System.Char[]
intermediarios. :-)
Si desea comprimir la conversión de string
a a SecureString
en una LINQ
declaración, puede expresarla 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 el 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 declaración anterior puede ofrecer es mantener juntos la creación del SecureString
, su inicialización con datos y finalmente bloquearlo de la modificación.
Las siguientes 2 extensiones deberían hacer el truco:
Para una char
matriz
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
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 AppendChar
recomendación.
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;
}
12345
... ¡ese es el tipo de cosas que un idiota tiene en su equipaje!"