Estou criando um aplicativo do Windows, no qual você precisa fazer login primeiro.
Os detalhes da conta consistem em nome de usuário e senha e precisam ser salvos localmente.
É apenas uma questão de segurança, para que outras pessoas que usam o mesmo computador não possam ver os dados pessoais de todos.
Qual é a maneira melhor / mais segura de salvar esses dados?
Não quero usar um banco de dados, então tentei algumas coisas com arquivos de recursos.
Mas, como sou novato nisso, não tenho certeza do que estou fazendo e onde devo procurar uma solução.
Respostas:
Se você for apenas verificar / validar o nome de usuário e a senha inseridos, use a classe Rfc2898DerivedBytes (também conhecida como Função 2 de Derivação de Chave Baseada em Senha ou PBKDF2). Isso é mais seguro do que usar criptografia como Triple DES ou AES porque não há uma maneira prática de voltar do resultado de RFC2898DerivedBytes para a senha. Você só pode ir de uma senha para o resultado. Consulte Está certo usar o hash SHA1 de senha como um sal ao derivar a chave de criptografia e IV da sequência de senha? para obter um exemplo e discussão para .Net ou String criptografar / descriptografar com a senha c # Metro Style para WinRT / Metro.
Se você estiver armazenando a senha para reutilização, como fornecê-la a terceiros, use a API de Proteção de Dados do Windows (DPAPI) . Isso usa chaves protegidas e geradas pelo sistema operacional e o algoritmo de criptografia Triple DES para criptografar e descriptografar informações. Isso significa que seu aplicativo não precisa se preocupar em gerar e proteger as chaves de criptografia, uma grande preocupação ao usar criptografia.
Em C #, use a classe System.Security.Cryptography.ProtectedData . Por exemplo, para criptografar um dado, use
ProtectedData.Protect()
:Armazene a entropia e o texto cifrado com segurança, como em um arquivo ou chave de registro com permissões definidas para que apenas o usuário atual possa lê-lo. Para obter acesso aos dados originais, use
ProtectedData.Unprotect()
:Observe que existem considerações adicionais de segurança. Por exemplo, evite armazenar segredos como senhas como um
string
. Strings são imutáveis, sendo que não podem ser notificados na memória para que alguém olhando para a memória do aplicativo ou um despejo de memória possa ver a senha. Use SecureString ou um byte [] em vez disso e lembre-se de descartá-los ou zerá-los assim que a senha não for mais necessária.fonte
ProtectedData
é para que eu não precise me preocupar em Armazenar a entropia e o texto cifrado com segurança, ... para que apenas o usuário atual possa lê-lo . Acho que oferece simplicidade na medida em que posso armazená-los, no entanto, é conveniente e ainda assim apenas o CurrentUser pode descriptografá-lo. Oentropy
parâmetro também é opcional e parece semelhante a um IV, onde a exclusividade é mais importante do que o sigilo. Como tal, o valor provavelmente pode ser omitido ou codificado no programa em situações em que a variação e atualização do texto simples não são frequentes.Já usei isso antes e acho que para garantir que a credencial persista e da melhor maneira segura,
ConfigurationManager
classeSecureString
classeCryptography
namespace.Este link será de grande ajuda, espero: Clique aqui
fonte
DPAPI é apenas para esse propósito. Use a DPAPI para criptografar a senha na primeira vez que o usuário inserir is, armazene-a em um local seguro (registro do usuário, diretório de dados do aplicativo do usuário, são algumas opções). Sempre que o aplicativo for iniciado, verifique o local para ver se sua chave existe, se ele usa DPAPI para descriptografá-la e permitir o acesso, caso contrário, negue-a.
fonte
Isso só funciona no Windows, então se você está planejando usar multiplataforma dotnet core, você terá que procurar em outro lugar. Veja https://github.com/dotnet/corefx/blob/master/Documentation/architecture/cross-platform-cryptography.md
fonte
Eu queria criptografar e descriptografar a string como uma string legível.
Aqui está um exemplo rápido muito simples em C # Visual Studio 2019 WinForms com base na resposta de
@Pradip
.Clique com o botão direito em projeto> propriedades> configurações> Criar uma configuração
username
epassword
.Agora você pode aproveitar as configurações que acabou de criar. Aqui, salvo o
username
e,password
mas apenas criptografo opassword
em seu campo de valor respeitável nouser.config
arquivo.Exemplo da string criptografada no
user.config
arquivo.Código Completo
fonte