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?

Foi útil?

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top