Pergunta

Esta questão já tem uma resposta aqui:

Existe qualquer disponível que não é trivialmente quebrável?

Foi útil?

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:

  1. 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.

  2. 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

  3. A segurança é um campo difícil, não acho que você pode inventar seus próprios algoritmos e protocolos.

  4. 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:

  1. Nunca guarde uma senha de texto simples (o que significa que você nunca pode exibir ou transmitir qualquer um.)
  2. Nunca transmita a representação armazenada de uma senha através de uma linha sem garantia (texto seja simples, codificada ou hash).
  3. velocidade é seu inimigo.
  4. Regularmente reanalisar e melhorar o seu processo como hardware e criptoanálise melhora.
  5. Criptografia e processo é uma parte muito pequena da solução.
  6. Pontos de falha incluem:. Armazenamento, cliente, transmissão, processamento, usuário, mandados judiciais, intrusão, e os administradores

Passos:

  1. Aplicar alguns requisitos de senha mínimo razoável.
  2. Altere as senhas com freqüência.
  3. Use o hash mais forte você pode obter -. SHA-256 foi sugerido aqui
  4. Combine a senha com um sal fixo (a mesma para toda a sua base de dados).
  5. 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.
  6. 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.

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