Como salvar uma senha no registro
-
20-09-2019 - |
Pergunta
Eu tenho um aplicativo de desktop com uma interface remota. O acesso à interface remota é protegido por um nome de usuário e senha.
Qual seria a melhor maneira de economizar essa senha com segurança, de preferência no registro?
Solução
Você precisaria salvar a senha de hash (seja no registro ou em outro lugar). Então, quando o usuário insere a senha, você verifica a versão com hash do que ele entra com a versão hashed conforme armazenado. Se eles corresponderem, as senhas correspondem e você poderá deixar o usuário entrar.
Dessa forma, você não está armazenando a senha em texto simples para ninguém (inclusive você) obter e obter acesso como outra pessoa.
Quanto ao algoritmo de hash para usar - não sei. Há muito por onde escolher, por isso estou relutante em recomendar um cego. Eu sugiro que você encontre vários e os avalie. CSharpfriends tem um artigo que parece ser um bom ponto de partida.
Outras dicas
Se você precisar armazenar uma senha não lascada, consulte o uso do Classe ProtectedData. Isso faz uso do API de proteção de dados (DPAPI) Qual é a melhor maneira de garantir dados no Windows.
Aqui está uma pequena classe que envolve os dados protegidos e fornece dois métodos de extensão na string para criptografar e descriptografar dados:
public static class DataProtectionApiWrapper
{
/// <summary>
/// Specifies the data protection scope of the DPAPI.
/// </summary>
private const DataProtectionScope Scope = DataProtectionScope.CurrentUser;
public static string Encrypt(this string text)
{
if (text == null)
{
throw new ArgumentNullException("text");
}
//encrypt data
var data = Encoding.Unicode.GetBytes(text);
byte[] encrypted = ProtectedData.Protect(data, null, Scope);
//return as base64 string
return Convert.ToBase64String(encrypted);
}
public static string Decrypt(this string cipher)
{
if (cipher == null)
{
throw new ArgumentNullException("cipher");
}
//parse base64 string
byte[] data = Convert.FromBase64String(cipher);
//decrypt data
byte[] decrypted = ProtectedData.Unprotect(data, null, Scope);
return Encoding.Unicode.GetString(decrypted);
}
}