Como criptografar e decodificar senhas

André Chaves
Code Maestro
Published in
5 min readMar 28, 2019

Nos dias de hoje, com leis cada vez mais rígidas para proteção de dados na internet, não basta saber fazer um sistema de login com autenticação e autorização.

O que acontece se por alguma desgraça do destino alguém invadir nosso sistema? Os dados sensíveis, como a senha, dos nossos usuários estão seguros?

Nesse post vamos ver como resolver isso criptografando senhas com o Symfony =)

Garantindo a segurança

Para garantir que a senha dos nossos usuários não vão vazar, nem mesmo se alguém conseguir acessar a base de dados, precisamos que ela seja ilegível.

Ou seja, a gente não pode guardar no banco de dados algo que alguém consiga interpretar e reproduzir. Nem mesmo a gente!

Beleza, mas como?

Um jeito bem simples que qualquer um já fez uma vez na vida seria trocar as letras/números da senha por símbolos!

Ou seja, a gente troca todos os 'A's por '%', todos os 'B's por '#' e assim por diante. Desse jeito, se alguém invadir a base, vai encontrar a senha em um estado não aproveitável.

Porém, esse seria um algoritmo de criptografia ridiculamente básico e com um pouco de esforço e tempo qualquer um conseguiria traduzir nossa substituição (decriptar).

MD5!

Assim como a gente consegue criar um algoritmo de criptografia, outros algoritmos já existem e são bem famosos. Como, por exemplo, o md5 que já é muito mais robusto que simplesmente substituir letras!

Porém, esse algoritmo é tão famoso, que já existem diversas bases na internet para mapear resultados dessa criptografia com os valores originais.

Quem nunca viu um site para decriptar md5 por ai?

Ou seja, evite usar MD5!

E agora?

Para nossa alegria, existem outros algoritmos menos famosos e mais seguros no mundo como o SHA1 e Bcrypt que nos permitem, inclusive, definir quão forte será a senha! O que dificulta bastante a abordagem de mapear resultados =)

Mãos na massa

No Symfony, temos um lugar já específico para configuração de dados relacionados a segurança, o famoso security.yaml.

Na sessão encoders, a gente pode definir um algoritmo de criptografia específico e quão forte será a senha para cada UserProvider!

Definindo a criptografia do usuário

No nosso caso, usamos o bcrypt como forma de criptografia e 10 sendo a "força" (cost) da senha, mas poderia ser qualquer outra =)

A vantagem dessa abordagem com o Symfony é que, para casos diferentes de usuários, podemos usar pesos diferentes para as senhas. Ou até mesmo criptografias diferentes!

Além disso, se daqui 5 anos o bcrypt estiver muito manjado, basta trocar ali o tipo de criptografia o que facilita muito a manutenibilidade do sistema a longo prazo =)

Beleza, e como eu uso a criptografia?

Como a gente já configurou o encoder do nosso Usuario, agora antes de criar um usuário no sistema, precisamos criptografar e redefinir a senha consumindo essa configuração.

Felizmente, o Symfony já fornece pra gente a interface UserPasswordEncoderInterface que, em suas implementações, encapsula toda a complexidade em consumir a configuração!

Criptografando a senha com UserPasswordEncoder

Ou seja, a gente precisa injetar esse UserPasswordEncoderInterface no controller onde criamos o usuario

password encoder injetado na action que cria usuario

Aqui já da pra ver que esse encoder tem só dois métodos. O isPasswordValid e o encodePassword.

Nesse exato momento, vamos precisar do encodePassword, que recebe apenas o usuário e a senha pura devolvendo direto a senha já criptografada!

Criptografando a senha com o encoder

Tendo a senha criptografada, é só redefinir a senha com o setSenha =)

E funciona mesmo?

Agora, criando um usuário novo, no banco de dados não temos mais a senha explicita:

senha criptografada no banco de dados

Ou seja, mesmo que alguém consiga invadir nosso banco de dados as contas dos nosso usuários estarão seguras!

Porém, nosso trabalho não acaba apenas criptografando a senha. Afinal, agora nem a gente consegue mais verificar se essa senha é válida!

Atualizando o Authenticator com o encoder

Agora que temos uma criptografia mais robusta implementada no sistema, precisamos atualizar a verificação da senha também. Sem criptografia temos uma comparação mais básica e direta

verificação de senha sem criptografia no Authenticator

Porém, agora precisamos do UserPasswordEncoder! E ele já encapsula toda a complexidade em verificar se nossa senha é válida ou não!

Ou seja, a gente precisa desse UserPasswordEncoder no authenticator também

Injetando o UserPasswordEncoderInterface no construtor do Authenticator

E, agora, basta chamar o método isPasswordValid do encoder passando nosso usuário e a senha não criptografada

usando o encoder para verificar se a senha é válida

E pronto! Com isso temos senhas seguras no banco de dados e já conseguimos processar essas senhas =)

Próximos passos

E ai, o que você achou da criptografia com o Symfony? Conhece alguma outra forma? Compartilha aqui com a gente!

No próximo post, vamos fugir um pouco dos processes de autenticação e autorização e vamos falar um pouco sobre paginação como foi sugerido pelo Gui aqui no blog!

Ah, o código pronto desse post você encontra lá no meu git =)

--

--

André Chaves
Code Maestro

Empreendedor, CTO, desenvolvedor e apaixonado por automação.