tag - summary param name c#
Las mejores prácticas para guardar datos confidenciales en Windows 8 (3)
Depende de lo que necesite, si realmente necesita almacenar las contraseñas, debe utilizar un algoritmo de cifrado bidireccional como 3DES / RC2 / Rijndael, etc.
Sin embargo, si todo lo que necesita hacer es verificar si una contraseña es correcta, se recomienda usar una función de un solo camino para almacenar un hash.
Cuando se trata de datos confidenciales, realmente recomiendo cifrarlos / codificarlos, incluso si usa Windows 8. El cifrado significa una sobrecarga adicional, pero en la mayoría de los casos no notará la diferencia de velocidad.
¿Sería mejor escribir tu propio algoritmo personalizado / lite? Como un chico de seguridad te aconsejo que no lo hagas. Las personas pasan años probando, mejorando y tratando de encontrar agujeros en los algoritmos existentes. Los que sobrevivieron son por lo tanto bastante buenos.
¿Cuál es la mejor manera de guardar datos confidenciales en un archivo local en Windows 8? Estoy desarrollando una aplicación de C # que necesita almacenar tokens o contraseñas de oAuth. He oído que era habitual en .NET cifrar / descifrar datos, pero no tengo ninguna experiencia con esos mecanismos. ¿Sigue siendo recomendable el cifrado / es necesario dado que las aplicaciones de Windows 8 tienen su propia área de almacenamiento personal / protegida similar a Windows Phone?
Además, ¿el cifrado / descifrado cada vez que solicita los datos provoca un problema de rendimiento? (¿Sería mejor escribir un algoritmo personalizado / lite?)
Podrías encriptar así:
public static string EncodePassword(string password)
{
byte[] bytes = Encoding.Unicode.GetBytes(password);
byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(bytes);
return Convert.ToBase64String(inArray);
}
Y cuando verifica la entrada del usuario, también la introduce en este método y verifica que coincida.
En el caso de los datos que coloque en un xml (por ejemplo) que desea cifrar / descifrar, puede usar RijndaelManaged.
-Editar1-
Un ejemplo: si tiene una pequeña pantalla de inicio de sesión que aparece (ShowDialog), puede hacerlo de esta manera:
private void settings_Click(object sender, RoutedEventArgs e)
{
Login log = new Login(); //login window
log.ShowDialog(); //show the login window
string un = log.userName.Text; //the user input from the username field
string pw = log.passWord.Password; //the userinput from the password input
if (EncodePassword(un) == Properties.Settings.Default.adminUsername && EncodePassword(pw) == Properties.Settings.Default.adminPassword) //in my case, i stored it in the app settings, but this could also be somewhere else.
{
//login was correct
//do something
}
else
{
//login was not correct
}
}
ACTUALIZACIÓN: tenga en cuenta que mientras que las aplicaciones modernas / metro no pueden tocar las cosas de las demás, las aplicaciones de escritorio tendrán acceso ilimitado a todos los datos almacenados a través de estas API. Consulte http://www.hanselman.com/blog/SavingAndRetrievingBrowserAndOtherPasswords.aspx que incluye el código que lo demuestra.
Win8 tiene una nueva API llamada PasswordVault que está diseñada para resolver todos estos problemas difíciles por usted. Realmente fácil de usar, seguro, y puede ser configurado por los usuarios para moverse entre sus máquinas para que solo tengan que ingresar las credenciales una vez. He utilizado con éxito esto para tokens OAuth
Recuperando credenciales (note la estúpida excepción que WinRT plantea ... realmente deberían devolver nulo):
const string VAULT_RESOURCE = "[My App] Credentials";
string UserName { get; set; };
string Password { get; set; };
var vault = new PasswordVault();
try
{
var creds = vault.FindAllByResource(VAULT_RESOURCE).FirstOrDefault();
if (creds != null)
{
UserName = creds.UserName;
Password = vault.Retrieve(VAULT_RESOURCE, UserName).Password;
}
}
catch(COMException)
{
// this exception likely means that no credentials have been stored
}
Almacenamiento de credenciales:
vault.Add(new PasswordCredential(VAULT_RESOURCE, UserName, Password));
Eliminación de credenciales (cuando el usuario hace clic en el botón de cierre de sesión en su aplicación):
vault.Remove(_vault.Retrieve(VAULT_RESOURCE, UserName));