O algoritmo devo usar para senhas de hash para o meu banco de dados? [duplicado]
-
02-07-2019 - |
Pergunta
Esta questão já tem uma resposta aqui:
- Secure Password Hashing 9 respostas
Existe qualquer disponível que não é trivialmente quebrável?
Solução
Esta resposta 2008 é agora perigosamente fora de data. SHA (todas as variantes) agora é trivialmente quebrável, e melhor prática é agora (a partir de janeiro de 2013) de usar um hash de alongamento chave (como PBKDF2) ou, idealmente, uma RAM de um intensivo (como Bcrypt ) e para adicionar um sal por usuário também.
Os pontos 2, 3 e 4 são ainda vale a pena pagar a atenção.
Veja a IT Security SE local para mais.
Original resposta 2008:
-
Use um algoritmo comprovado. SHA-256 usos 64 caracteres na base de dados, mas com um índice em coluna que não é um problema, e é um hash comprovada e mais confiável do que os MD5 e SHA-1. Ele também é implementado na maioria dos idiomas, como parte do pacote de segurança padrão. No entanto, não se sinta mal se você usar SHA-1.
-
Não basta criptografar a senha, mas colocar outras informações nele também. Você muitas vezes usam o hash. "Username: password: sal" ou similar, ao invés de apenas a senha, mas se você jogar com isso, então você torná-lo ainda mais difícil de executar um ataque de dicionário
-
A segurança é um campo difícil, não acho que você pode inventar seus próprios algoritmos e protocolos.
-
Não logs de escrever como "[AddUser] Hash de GeorgeBush: Rep4Lyfe: ASOIJNTY é xyz"
Outras dicas
A primeira regra de criptografia e armazenamento de senha é " não inventá-lo-se ", mas se você tem aqui é o mínimo absoluto que você deve fazer para ter qualquer aparência de segurança:
Regras cardeais:
- Nunca guarde uma senha de texto simples (o que significa que você nunca pode exibir ou transmitir qualquer um.)
- Nunca transmita a representação armazenada de uma senha através de uma linha sem garantia (texto seja simples, codificada ou hash).
- velocidade é seu inimigo.
- Regularmente reanalisar e melhorar o seu processo como hardware e criptoanálise melhora.
- Criptografia e processo é uma parte muito pequena da solução.
- Pontos de falha incluem:. Armazenamento, cliente, transmissão, processamento, usuário, mandados judiciais, intrusão, e os administradores
Passos:
- Aplicar alguns requisitos de senha mínimo razoável.
- Altere as senhas com freqüência.
- Use o hash mais forte você pode obter -. SHA-256 foi sugerido aqui
- Combine a senha com um sal fixo (a mesma para toda a sua base de dados).
- Combine o resultado da etapa anterior com um sal única (talvez o nome de utilizador, ID de registro, um guid, um número aleatório longo, etc.) que é armazenado e anexado a este registo.
- Execute o algoritmo de hash várias vezes - como 1000 vezes . Idealmente incluem um sal diferente de cada vez com o hash anterior. A velocidade é o seu inimigo e várias iterações reduz a velocidade. De vez em quando dobrar as iterações (isto requer a captura de um novo hash -. Fazê-lo na próxima vez que alterar sua senha)
Oh, e se você estiver executando SSL ou algum outro segurança de linha, em seguida, não permitem sua senha a ser transmitido em texto simples. E se você apenas está comparando o hash final a partir do cliente para o seu hash armazenado, em seguida, não permitem que sejam transmitidos em texto simples também. Você precisa enviar um nonce (número usado uma vez) para o cliente e tê-los hash que com o seu hash gerados (usando as etapas acima) de hash e, em seguida, enviar-lhe aquele. No lado do servidor que executar o mesmo processo e ver se os dois uma hashes tempo corresponderem. Em seguida, eliminá-los. Há uma maneira melhor, mas isso é o mais simples.
CodingHorror teve um ótimo artigo sobre isso no ano passado
http://www.codinghorror.com/blog/archives/000953.html
A recomendação no final do artigo é bcrypt
Os algoritmos acima mencionados são algoritmos de hash criptograficamente seguras (mas MD5 não é considerado seguro hoje).
No entanto, existem algoritmos, que especificamente criados para chaves derivar de senhas. Estes são os funções-chave derivação . Eles são projetados para uso com cifras simétricas, mas eles são bons para o armazenamento de senha também. PBKDF2 por exemplo sal de usos, o grande número de iterações, e uma boa função hash. Se você tem uma biblioteca, que implementa-lo (por exemplo, NET), eu acho que você deve considerá-lo.
Adicionar um única sal para o valor hash de senha (armazenar o valor sal no db). Quando um sal exclusivo é usado o benefício de usar um algoritmo mais seguro do que o SHA1 ou MD5 não é realmente necessário (nesse ponto é uma melhoria incremental, enquanto usando um sal é uma melhoria monumental).
Use uma forte função hash criptográfica como MD5 ou SHA1, mas certifique-se de usar um bom sal , caso contrário, você estará suscetível a tabela do arco-íris ataques.
Atualização janeiro 2013
A resposta original é de 2008, e as coisas mudaram um pouco nos últimos 5 anos. A disponibilidade imediata de computação em nuvem e poderosas paralelo de processadores gráficos cartas significa que as senhas até 8 ou 9 caracteres de hash como MD5 ou SHA1 agora são trivialmente quebrável.
Agora, um sal de tempo é uma obrigação, como é algo mais difícil como SHA512.
No entanto todos os hashes variantes SHA são projetados para criptografia de comunicação -. Mensagens de volta e para a frente, onde cada mensagem é criptografada, e por esta razão eles são projetados para ser rápido
No mundo a senha hashing este projeto é uma grande desvantagem como o mais rápido o hash é o gerar o menos tempo que leva para gerar um grande número de hashes.
Um hash rápido como SHA512 podem ser gerados milhões, até bilhões de vezes por segundo. O lance em processamento paralelo barato e cada permutação possível de uma senha torna-se uma necessidade absoluta.
Key-alongamento é uma maneira de combater isso. Um algoritmo de alongamento chave (como PBKDF2) aplica-se um hash mais rápida (como SHA512) milhares de vezes, tipicamente provocando a geração de hash para tomar 1/5 de um segundo ou menos. logging alguém não vai notar, mas se você só pode gerar 5 hashes por segundo a força bruta ataques são muito mais duras.
Em segundo lugar, deve sempre ser um sal aleatório por usuário. Isto pode ser gerado aleatoriamente como o primeiro n bytes do hash (que são então retirado e adicionado ao texto de senha a ser verificado antes de construir os hashes para comparar) ou como uma coluna DB extra.
Assim:
O algoritmo deve eu uso para senhas de hash para o meu banco de dados?
-
Key-stretching para abrandar geração de hash. Eu provavelmente iria com PBKDF2.
-
sal por usuário significa um novo ataque por usuário, e algum trabalho para descobrir como tirar o sal.
poder de computação e disponibilidade estão a subir exponencialmente - as chances são essas regras irão mudar novamente em mais 4 anos. Se você precisa de segurança à prova de futuro eu investigar bcrypt / Scrypt hashes estilo - estes têm os algoritmos de alongamento chave mais lentas e adicione uma etapa que utiliza uma grande quantidade de RAM para gerar o hash. Usando tanto RAM reduz a eficácia dos processadores paralelos baratos.
Original setembro 2008 (à esquerda na tão comentários sentido)
MD5 + sal ou SHA1 + sal não é 'trivialmente quebrável' - a maioria dos hacks depender de grandes tabelas do arco-íris e estes tornam-se menos útil com um [update, now they are]
sal.
MD5 + sal é uma opção relativamente fraco, mas não vai ser [update, now it is very easy to break]
facilmente quebrado.
SHA2 vai todo o caminho até 512 - que vai ser quase impossível de crack com [update, pretty easy up to 9 char passwords now]
kit prontamente disponível - embora eu tenho certeza que há um Cray em algum lugar casamata militar que pode fazê-lo [You can now rent this 'Cray' from Amazon]
MD5 ou SHA em combinação com um sal valor gerado aleatoriamente para cada entrada
como mencionado algoritmos de hash anteriormente simples não deve ser usado aqui é a razão por que:
http://arstechnica.com/security/2012/08/passwords -under-agressão /
para uso outra coisa, como http: // msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx
Todos os algoritmos de hash são vulneráveis ??a um "ataque de dicionário". Isto é simplesmente onde o atacante tem um grande dicionário de senhas possíveis, e eles botar todos eles. Eles, então, ver se algum desses hashes corresponder ao hash da senha que deseja descriptografar. Esta técnica pode facilmente testar milhões de senhas. É por isso que você precisa para evitar qualquer senha que pode ser remotamente previsível.
Mas, se você estiver disposto a aceitar a ameaça de um ataque de dicionário, MD5 e SHA1 que cada ser mais do que adequado. SHA1 é mais seguro, mas para a maioria das aplicações isso realmente não é uma melhoria significativa.
MD5 / hashes SHA1 são boas escolhas. MD5 é ligeiramente mais fraco do que SHA1.