Gostaria de armazenar o hash de uma senha no telefone, mas não tenho certeza de como fazer isso. Só consigo encontrar métodos de criptografia. Como a senha deve ser hash corretamente?
117
ATUALIZAÇÃO : ESTA RESPOSTA ESTÁ SERIAMENTE DESATIVADA . Use as recomendações de https://stackoverflow.com/a/10402129/251311 .
Você pode usar
var md5 = new MD5CryptoServiceProvider();
var md5data = md5.ComputeHash(data);
ou
var sha1 = new SHA1CryptoServiceProvider();
var sha1data = sha1.ComputeHash(data);
Para obter uma data
matriz de bytes, você pode usar
var data = Encoding.ASCII.GetBytes(password);
e para recuperar a corda de md5data
ousha1data
var hashedPassword = ASCIIEncoding.GetString(md5data);
using
instrução ou chamáClear()
-lo quando terminar de usar a implementação.md5
é bom o suficiente para quase todos os tipos de tarefas. Suas vulnerabilidades também se referem a situações muito específicas e quase exigem que o invasor saiba muito sobre criptografia.A maioria das outras respostas aqui está um tanto desatualizada com as melhores práticas de hoje. Como tal, aqui está a aplicação de PBKDF2 /
Rfc2898DeriveBytes
para armazenar e verificar senhas. O código a seguir está em uma classe autônoma nesta postagem: Outro exemplo de como armazenar um hash de senha com salt . O básico é muito fácil, então aqui está dividido:PASSO 1 Crie o valor de sal com um PRNG criptográfico:
ETAPA 2 Crie o Rfc2898DeriveBytes e obtenha o valor de hash:
PASSO 3 Combine os bytes salt e password para uso posterior:
PASSO 4 Transforme o sal + hash combinado em uma string para armazenamento
ETAPA 5 Verifique a senha inserida pelo usuário em relação a uma senha armazenada
Nota: Dependendo dos requisitos de desempenho de sua aplicação específica, o valor
100000
pode ser reduzido. Um valor mínimo deve ser próximo10000
.fonte
Com base na ótima resposta do csharptest.net , escrevi uma aula para isso:
Uso:
Um hash de amostra pode ser este:
Como você pode ver, também incluí as iterações no hash para facilitar o uso e a possibilidade de atualizá-lo, se precisarmos atualizar.
Se você estiver interessado em .net core, também tenho uma versão .net core no Code Review .
fonte
V1
eV2
qual o método que você precisa de verificação.Eu uso um hash e um salt para a criptografia de minha senha (é o mesmo hash que o Asp.Net Membership usa):
fonte
fonte
As respostas de @csharptest.net e Christian Gollhardt são ótimas, muito obrigado. Mas depois de executar esse código em produção com milhões de registros, descobri que há um vazamento de memória. As classes RNGCryptoServiceProvider e Rfc2898DeriveBytes são derivadas de IDisposable, mas não as descartamos. Escreverei minha solução como resposta caso alguém precise com versão descartada.
Uso:
fonte
Acho que usar KeyDerivation.Pbkdf2 é melhor do que Rfc2898DeriveBytes.
Exemplo e explicação: senhas de hash no ASP.NET Core
Este é um exemplo de código do artigo. E é um nível mínimo de segurança. Para aumentá-lo, eu usaria em vez do parâmetro KeyDerivationPrf.HMACSHA1
KeyDerivationPrf.HMACSHA256 ou KeyDerivationPrf.HMACSHA512.
Não comprometa o hash de senha. Existem muitos métodos matematicamente sólidos para otimizar o hack de senha. As consequências podem ser desastrosas. Uma vez que um malfeitor pode colocar as mãos na tabela de hash de senha de seus usuários, seria relativamente fácil para ele quebrar as senhas, dado que o algoritmo é fraco ou a implementação está incorreta. Ele tem muito tempo (tempo x capacidade do computador) para decifrar senhas. O hash de senha deve ser criptograficamente forte para transformar "muito tempo" em " quantidade de tempo irracional ".
Mais um ponto a adicionar
A verificação de hash leva tempo (e é bom). Quando o usuário insere um nome de usuário incorreto, não leva tempo para verificar se o nome de usuário está incorreto. Quando o nome de usuário está correto, iniciamos a verificação de senha - é um processo relativamente longo.
Para um hacker, seria muito fácil entender se o usuário existe ou não.
Certifique-se de não retornar uma resposta imediata quando o nome do usuário estiver errado.
Nem é preciso dizer: nunca responda o que está errado. Apenas "credenciais erradas" gerais.
fonte