Primeiro, alguns termos que são importantes:
Hashing - O ato de pegar uma string e produzir uma sequência de caracteres que não podem ser revertidos para a string original.
Criptografia simétrica - (geralmente chamada de 'criptografia') - O ato de pegar uma string e produzir uma sequência de caracteres que podem ser descriptografados para a string original através do uso da mesma chave de criptografia que a criptografou.
Tabela Arco-Íris - uma tabela de pesquisa que contém todas as variações de caracteres com hash em um algoritmo de hash específico.
Salt - uma string aleatória conhecida anexada à string original antes de ser hash.
Para o .NET Framework, o Bcrypt ainda não possui uma implementação de referência verificada . Isso é importante porque não há como saber se há falhas sérias em uma implementação existente. Você pode obter uma implementação do BCrypt for .NET aqui . Não sei o suficiente sobre criptografia para dizer se é uma implementação boa ou ruim. A criptografia é um campo muito profundo. Não tente criar seu próprio algoritmo de criptografia . Seriamente.
Se você estiver implementando sua própria segurança de senha (suspiro), precisará fazer várias coisas:
- Use um algoritmo de hash relativamente seguro .
- Sal cada senha antes de ser hash.
- Use um sal longo e exclusivo para cada senha e armazene o sal com a senha.
- Exija senhas fortes .
Infelizmente, mesmo se você fizer tudo isso, um hacker determinado ainda pode descobrir as senhas, isso levaria muito tempo. Esse é o seu principal inimigo: o tempo .
O algoritmo bcrypt funciona porque são necessárias cinco ordens de magnitude mais para o hash de uma senha que o MD5 ; (e ainda muito mais longo que o AES ou o SHA-512). Isso força o hacker a gastar muito mais tempo para criar uma tabela de arco-íris para procurar suas senhas, tornando muito menos provável que suas senhas corram o risco de serem invadidas.
Se você estiver salgando e hash suas senhas e cada sal for diferente, um hacker em potencial precisará criar uma tabela arco-íris para cada variação de sal , apenas para ter uma tabela arco-íris para uma senha salgada + com hash. Isso significa que, se você possui 1 milhão de usuários, um hacker precisa gerar 1 milhão de tabelas arco-íris. Se você estiver usando o mesmo sal para todos os usuários, o hacker precisará gerar apenas 1 tabela arco-íris para invadir com êxito o seu sistema.
Se você não está salgando suas senhas, tudo o que um invasor precisa fazer é acessar uma tabela Rainbow existente para todas as implementações existentes (AES, SHA-512, MD5) e apenas verificar se uma delas corresponde ao hash. Isso já foi feito , um invasor não precisa calcular essas tabelas do Rainbow .
Mesmo com tudo isso, você deve usar boas práticas de segurança . Se eles puderem usar com êxito outro vetor de ataque (XSS, SQL Injection, CSRF, etc. ) em seu site, uma boa segurança de senha não importa. Parece uma declaração controversa, mas pense bem: se eu posso obter todas as informações do usuário por meio de um ataque de injeção de SQL, ou posso permitir que seus usuários me forneçam seus cookies através do XSS, não importa a qualidade da sua senha. segurança é .
Outros recursos:
- Jeff Atwood: criptografia .NET simplificada (excelente para uma visão geral do hash)
- Jeff Atwood: Acabei de entrar como você
- Jeff Atwood: Você provavelmente está armazenando senhas incorretamente
- Jeff Atwood: Speed Hashing
Nota: Por favor, recomende outros bons recursos. Devo ter lido uma dúzia de artigos de dezenas de autores, mas poucos escrevem tão claramente sobre o assunto quanto Jeff. Edite os artigos à medida que os encontrar.