Olá pessoal! Na semana passada, publicamos a
primeira parte deste artigo, que causou um sério holivar.
Uma das principais reclamações foi a falta de menção de password_hash
no artigo, como prometemos, a segunda parte deste material começará da mesma forma com o hash da password_hash
usando password_hash
. Lembramos também que a redação deste artigo foi inspirada no lançamento de um novo grupo no curso “Backend PHP Developer” , mas esse material não tem nada a ver com o programa de treinamento.
Você pode aprender mais sobre o programa de treinamento no dia da casa aberta e, com o exemplo de um webinar gratuito sobre o tópico “PHP sem servidor” , pode avaliar o formato das palestras.
Talvez concluiremos esse prefácio já prolongado e iremos diretamente para o artigo.
Hash de senha com password_hash
Esta função cria um hash de senha de acordo com os parâmetros que definimos para ela. Ele usa um algoritmo unidirecional.
Podemos escolher qual tipo de algoritmo usar, definindo uma das constantes de nossa escolha:
PASSWORD_DEFAULT
do PHP 5.5 usa Bcrypt como o algoritmo padrão. No entanto, com o tempo, isso muda à medida que novos algoritmos mais seguros ou outros fatores são descobertos.PASSWORD_BCRYPT
cria um hash crypt()
. Geralmente contém 60 caracteres, podendo ser identificado por seu identificador no formato "$ 2y $" .PASSWORD-ARGON2I
Argônio2 é atualmente um dos algoritmos de hash mais seguros. Está disponível apenas se o PHP foi compilado com o Argon2.PASSWORD_ARGON2ID
Esse algoritmo de hash também pertence à família Argon2 e usa a versão do Argon2ID, não eu. Para que funcione, também é necessário que o PHP seja compilado usando o Argon2.
Essa função também possui um parâmetro opcional, que consiste em uma matriz associativa que aceita várias chaves de acordo com o algoritmo selecionado.
Se você preferir usar o Bcrypt, a chave desta sequência será o valor do custo.
Se você selecionar um algoritmo que usa Argon2, as chaves da matriz associativa são:
memory_cost
(um número inteiro indicando a quantidade máxima de memória necessária para calcular o hash),
time_cost
(um número inteiro indicando o tempo máximo necessário para calcular o hash) e
thread
(outro número inteiro um número indicando o número de encadeamentos usados para calcular o hash).
Não especifique o parâmetro
salt
no PHP 7.0, caso contrário, você receberá um aviso sobre a abordagem descontinuada.
Agora sabemos quais elementos são necessários para usar a função
password_hash()
. Vamos ver como prescrever.
echo password_hash("MySuperPass", PASSWORD_DEFAULT); $2y$10$TLayAY8ZaAZ9FE50EylGYO9oEgrb7gsw1yzJemHdBu1gOQfyWrEUm $options = ['cost' => 12,]; echo password_hash("MySuperPass", PASSWORD_BCRYPT, $options); $2y$12$jhmTbxAuZXVtX2y.Jc8iy.dW/NENqVCeq2vuoFI9/oa4./YlzhpYO echo password_hash('rasmuslerdorf', PASSWORD_ARGON2I); $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
Inicialmente, é recomendável testar esta função em seus servidores e configurar o parâmetro cost para que a execução da função leve menos de 100 milissegundos em sistemas interativos.
O script no exemplo acima o ajudará a definir o valor ideal de custo para o seu hardware.
Verificação de senha do usuário
Você deu aos usuários a oportunidade de se registrar no seu novo aplicativo, eles podem digitar suas senhas lá e você sabe muito bem como lidar com essa senha.
Ao fazer o hash dos dados de acordo com as últimas tendências de segurança, você não armazena nada de forma criptografada e o servidor fica oculto em um porão de 10 metros de profundidade.
O que agoraAgora você deve permitir que os usuários efetuem login no aplicativo. Para fazer isso, o PHP possui uma função interna que verifica a senha correspondente à sequência de hash. Essa função é chamada
password_verify()
. Funciona assim:
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; if (password_verify('rasmuslerdorf', $hash)) { echo ' !'; } else { echo ' !'; }
Ela tem dois parâmetros e ambos devem ter um formato de sequência. O primeiro parâmetro é a senha que o usuário digitou no formulário de login da conta. O segundo parâmetro são os dados diretamente com hash com os quais iremos consultar.
Como resultado, obtemos um valor lógico, pronto para uso em operações condicionais. Assim, podemos deixar o usuário entrar no aplicativo ou informá-lo que algo deu errado.
Esta função funciona porque na etapa anterior (quando tivemos a senha com hash), o valor retornado por
password_hash
incluía o algoritmo que usamos,
cost
e
salt
.
Assim, todas as informações necessárias para
password_verify()
estão disponíveis para nós.
O algoritmo do sistema de registro de usuários no PHP
Espero que agora você entenda as medidas de segurança que os desenvolvedores de PHP tomam ao lidar com senhas.
Primeiro, você precisa verificar uma pós-solicitação e, em seguida, selecionar e calcular o número de usuários cujos dados correspondem aos inseridos.
Se tudo correu bem, verificamos a senha e enviamos o usuário para a página inicial. Caso contrário, por exemplo, em Javascript, exibimos uma janela de aviso com uma notificação de erro.
Conclusão
Agora você sabe como garantir a segurança do seu aplicativo e como lidar com senhas corretamente. Seguir recomendações úteis não é apenas um padrão que você deve seguir, mas um caminho de desenvolvimento que deve ser agradável de seguir.
Aprenda novas técnicas semelhantes a como você acabou de aprender. Adicione funcionalidade adicional e experimente o código até obter excelentes habilidades de desenvolvimento da web - seja PHP ou qualquer outro idioma que não abra menos oportunidades!
Leia a primeira parte