Pergunta

Qual é a maneira mais rápida e segura de criptografar senhas (preferencialmente PHP) e, para qualquer método escolhido, ele é portátil?

Em outras palavras, se eu migrar meu site posteriormente para um servidor diferente, minhas senhas continuarão funcionando?

O método que estou usando agora, conforme me disseram, depende das versões exatas das bibliotecas instaladas no servidor.

Foi útil?

Solução

Se você está escolhendo um método de criptografia para o seu sistema de login, então a velocidade não é sua amiga, Jeff teve uma conversa com Thomas Ptacek sobre senhas e o conclusão era que você deveria usar o método de criptografia mais lento e seguro que puder.

Do blog de Thomas Ptacek:
Velocidade é exatamente o que você não deseja em uma função hash de senha.

Os esquemas de senha modernos são atacados com crackers de senha incrementais.

Os crackers incrementais não pré-calculam todas as senhas possíveis.Eles consideram cada hash de senha individualmente e alimentam seu dicionário por meio da função de hash de senha da mesma forma que sua página de login PHP faria.Crackers de mesa Rainbow como Ophcrack usam espaço para atacar senhas;crackers incrementais como John the Ripper, Crack e LC5 funcionam com o tempo:estatísticas e computação.

O jogo de ataque de senha é pontuado no tempo necessário para quebrar a senha X.Com tabelas arco-íris, esse tempo depende do tamanho que sua mesa precisa ter e da rapidez com que você pode pesquisá-la.Com crackers incrementais, o tempo depende de quão rápido você consegue executar a função hash de senha.

Quanto melhor você otimizar sua função de hash de senha, mais rápida será sua função de hash de senha e mais fraco será seu esquema.MD5 e SHA1, até mesmo cifras de bloco convencionais como DES, são projetadas para serem rápidas.MD5, SHA1 e DES são hashes de senha fracos.Em CPUs modernas, blocos de construção criptográficos brutos, como DES e MD5, podem ser divididos em bits, vetorizados e paralelizados para tornar as pesquisas de senha extremamente rápidas.As implementações de FPGA de fim de jogo custam apenas centenas de dólares.

Outras dicas

Estou com Pedro.O desenvolvedor parece não entender as senhas.Todos nós escolhemos (e eu também sou culpado disso) MD5 ou SHA1 porque eles são rápidos.Pensando bem (porque alguém me apontou isso recentemente) isso não faz nenhum sentido.Devíamos escolher um algoritmo de hash que fosse estúpido e lento.Quero dizer, na escala das coisas, um site movimentado fará hash de senhas, o quê?a cada 1/2 minuto?Quem se importa se leva 0,8 segundos versus 0,03 segundos no servidor?Mas essa lentidão extra é enorme para evitar todos os tipos de ataques comuns de força bruta.

Pela minha leitura, o bcrypt foi projetado especificamente para hashing seguro de senhas.É baseado em baiacu e há muitas implementações.

Para PHP, verifique PHPPass http://www.openwall.com/phpass/

Para quem usa .NET, confira BCrypt.NET http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

Deve-se ressaltar que você não quer criptografar a senha, você deseja cerquilha isto.

As senhas criptografadas podem ser descriptografadas, permitindo que alguém veja a senha.Hashing é uma operação unidirecional, portanto a senha original do usuário desaparece (criptograficamente).


Quanto a qual algoritmo você deve escolher - use o padrão atualmente aceito:

  • SHA-256

E quando você fizer o hash da senha do usuário, certifique-se de incluir também algum outro lixo com ela.por exemplo.:

  • senha: password1
  • sal: PasswordSaltDesignedForThisQuestion

Anexe o salt à senha do usuário:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");

Faça o que fizer, não escreva seu próprio algoritmo de criptografia.Fazer isso quase garantirá (a menos que você seja um criptógrafo) que haverá uma falha no algoritmo que tornará sua quebra trivial.

Considere usar bcrypt ele é usado em muitos frameworks modernos como o laravel.

Não estou necessariamente procurando o mais rápido, mas um bom equilíbrio, alguns dos servidores para os quais este código está sendo desenvolvido são bastante lentos, o script que faz o hash e armazena a senha está demorando de 5 a 6 segundos para ser executado, e eu tenho reduzi-o ao hash (se eu comentar o hash, ele será executado em 1-2 segundos).

Não precisa ser o MAIS seguro, não estou programando para um banco (agora), mas certamente NÃO VOU armazene as senhas como texto simples.

password_hash ( string $password , int $algo [, array $options ] ).(PHP 5 >= 5.5.0, PHP 7)

password_hash() cria um novo hash de senha usando um algoritmo de hash unilateral forte.password_hash() é compatível com crypt().Portanto, hashes de senha criados por crypt() podem ser usados ​​com password_hash().

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