Como armazenar as senhas corretamente com PHP

Garantir que as senhas dos usuários estão armazenadas corretamente no banco de dados da um certo trabalho, mas assim, ainda não é ciência de foguete, para você usar md5 porque é fácil. Vale lembrar que o md5 não serve para nada e bem no nível do NADA MESMO.

Muitas vezes, a validação de login fica como responsabilidade do banco de dados (Oi? Claro que não, ta louco!).

Quem não fez algo assim (favor ignorar o sql injection):

$sql = “SELECT id FROM user WHERE email=’$email’ AND password=MD5(‘$password’)”;

Você não valida depois se veio uma linha? Então, quem validou foi o banco…

Sendo desse jeito, não temos muito o que fazer. A primeira coisa que precisa ocorrer é alterar quem valida a senha do usuário e isso quem deve fazer é a aplicação.

Nesse contexto, vamos usar as funções de senhas do PHP.

password_hash

password_verify

Conforme manual, password_hash, vai gerar uma senha bem diferente do md5 e se fizer certinho não mexe mais (spoiler, explico no final).

Simples nesse nível:

Agora, o que é o que.

PASSWORD_DEFAULT

É uma constante do PHP que justamente gerencia qual será o algoritimo de criptografia. Ela será alterada caso em uma nova versão do PHP tenha uma forma melhor de criptografia.

cost

É o “custo” daquele hash, quanto maior o custo maior é o tempo para gerar uma senha (explicação prática do cost aqui). Por padrão o cost é 10, logo se eu não passase ele daria na mesma.

Blz, já salvei a senha do meu usuário e tudo mais, agora como eu valido isso?

Pois é, “tudo” isso.

Como bônus, agora vem a parte do corretamente.

O “password_needs_rehash” verifica se o hash usado como senha ainda é o melhor que há disponível.

Pense assim, hoje você esta usando o “cost” 10, mas amanhã vai começar a usar o 11, ou 12, ou o “PASSWORD_DEFAULT” mudou, quando que você vai alterar o hash da senha do usuário? Dessa forma, você já aproveita que você tem a senha do usuário e criptografa ela no novo padrão de hash.

Dessa forma, quando mudar o padrão de criptografia, ou quando você mudar a configuração do “cost” seu código já vai estar preparado para isso e o hash vai ser alterado para o mais novo.

Espero que isso ajude 🙂

Code Review

Faça Code Review, do que? De tudo.

Quando? A cada pull request.

E se eu não uso pull request? Se o time tem mais pessoas comece a usar.

Sério? Não não, escrevi tudo isso para te sacanear. Claro que precisa

Ela não é apenas para Open Source, fica a dica.

Brincadeiras a parte, fazer a revisão do código é a melhor forma de espalhar o conhecimento dentro do time, além disso, melhor maneira para que todos saibam e sigam os padrões de desenvolvimento adotados.

Pense no código como uma criança, ela precisa crescer, precisa de liberdade para criar as suas próprias ideias, fora isso, precisa também de supervisão, de alguém mostrando o caminho certo. É nesse momento que entra o Code Review, garantir que as influências das pessoas em sua criança sejam as melhores possíveis.

Não pense na revisão de código como algo para apontar os erros dos outros (isso é ser babaca), pense nela como algo que vai te fazer pensar diferente sobre o seu código, além de ouvir melhorias em sua forma de desenvolver, você vai receber códigos de várias pessoas que pensam diferente de você, assim, o estilo de programar e as formas de pensar serão diferentes. Assim logo você vai começar a pensar diferente.

Usando um exemplo, pegue o SEU código de um ano atrás e procure por coisas que você melhoraria nele, prepare-se, você vai anotar muita coisa. Vou deixar a continuação dessa parte para o post de refactoring.

Além de você melhorar o seu código, você vai garantir que o projeto que você esta vai ter um futuro melhor. Quando você revisa o código de alguém, pergunta por que a pessoa tomou aquela decisão e aponta pontos que podem ser melhorados, você vai ter um código melhor em sua produção. Dessa forma você vai poder ir para a casa e saber que no dia seguinte ele vai estar bem cuidado, afinal, nós não sabemos o dia de amanhã, podemos não estar mais nesse projeto, na empresa, ou pior, um bug em produção em um código que não da para entender.

Seguem aqui dois links falando um pouco mais sobre isso e também como fazer a revisão.

https://medium.com/medium-eng/the-code-review-mindset-3280a4af0a89

https://medium.com/swlh/code-reviews-can-make-or-break-your-team-a3cfdcc15de1

E era isso. Abraço a todos