Segurança do PHP: onde e como armazenar senhas. Parte 1

Todos os anos, mais e mais ataques de hackers ocorrem no mundo: desde roubos de cartões de crédito a sites de hackers de lojas online. Você tem certeza de que seus scripts estão realmente protegidos? Antecipando o início do curso “Backend PHP Developer”, nosso colega preparou uma publicação interessante sobre segurança em PHP ...




1. Introdução


O escândalo do Facebook e da Cambridge Analytica, o vazamento de correspondência do Partido Democrata dos EUA em 2016, a violação de dados do Google em 2018 e o hack do Yahoo Voice em 2012 são apenas alguns exemplos de grandes vazamentos registrados nos últimos anos.

Informações em escala global estão agora disponíveis para nós como nunca antes. Se você não tomar os devidos cuidados, as informações sobre nós mesmos (incluindo informações de natureza confidencial) também podem ser de domínio público.

Não importa que tipo de projeto você está desenvolvendo: um jogo infantil de código aberto ou a conclusão de um pedido de uma grande empresa. Sua responsabilidade como desenvolvedor da Web é fornecer segurança para todas as suas plataformas. A segurança é um aspecto muito difícil.

A linguagem PHP fornece várias ferramentas e funções que você pode usar para garantir a segurança do aplicativo.

3 regras de segurança de senha




As senhas de usuário devem permanecer desconhecidas para você.


Ainda me lembro dos meus primeiros passos como desenvolvedor PHP. A primeira aplicação que criei foi um jogo em que, juntamente com meus amigos, desempenhei o papel de construtor de arranha-céus. Cada um de nós pode fazer login em nossa conta, comprar construtores e enviar nossa equipe para um novo canteiro de obras toda semana. Criei contas básicas: adicionei um nome de usuário e uma senha para cada usuário e os enviei por e-mail. E só depois de alguns meses eu percebi o quão estúpido era.

A regra geral é a seguinte: você não deve apenas não conhecer as senhas dos seus usuários - não deve poder reconhecê-las. Esse é um aspecto muito sério que pode até implicar responsabilidade legal.

Por tentativa e erro, você ainda conclui que as senhas não precisam ser armazenadas em texto sem formatação ou de forma que possam ser facilmente descriptografadas.

Não insira restrições de senha


Vamos jogar um jogo. Tente adivinhar a senha:

**********

Difícil, certo? Vamos tentar o seguinte:

P * r *** e ***

Agora você sabe que há uma letra maiúscula e algumas maiúsculas. E se sim:

P * r *** e911

Agora será muito mais fácil adivinhar a senha - porque você sabe que ela inclui uma letra maiúscula, maiúscula e um número.

O mesmo acontece quando você impõe restrições aos usuários e máscaras para suas senhas. Se seu aplicativo precisar seguir um padrão específico, dê aos invasores dicas que eles podem usar contra você.

Exigir um certo tamanho mínimo de senha é normal, pois o tamanho da senha afeta o tempo necessário para buscá-la. No entanto, será muito mais útil descobrir como funcionam os algoritmos e o hash.

A propósito, a resposta correta para o enigma acima é "Porsche911" :)

Nunca envie senhas por email em sua forma mais pura


Um dos meus primeiros erros como desenvolvedor da Web foi não aprender a gerenciar senhas com antecedência.

Imagine que você é um cliente e contrata um desenvolvedor para criar um bom site de comércio eletrônico para sua empresa. O desenvolvedor enviou um e-mail com a senha do seu site. Agora você sabe três coisas sobre seu funcionário:

  1. Ele conhece sua senha.
  2. Ele armazena sua senha em sua forma mais pura, sem usar nenhuma criptografia.
  3. Ele não sente a menor preocupação ao enviar senhas pela Internet.

Em resposta, não há escolha a não ser demitir tal funcionário.

Aqui está o que um desenvolvedor da web deve fazer:

  1. Crie uma página em seu aplicativo da Web em que o usuário possa inserir seu e-mail, caso tenha esquecido a senha e, assim, solicitar uma nova senha.
  2. Seu aplicativo irá gerar direitos de acesso exclusivos e vinculá-lo ao usuário que fez a solicitação (eu pessoalmente uso um identificador individual universal).
  3. O aplicativo enviará ao usuário um email com um link que leva ao direito de acesso.

Assim que o usuário seguir o link, o aplicativo confirmará o acesso correto e permitirá que o usuário altere a senha.

Veja como a segurança do aplicativo aumentou com essas etapas simples? Se desejar, podemos aumentar ainda mais o nível de segurança adicionando um limite de tempo entre a solicitação e definindo uma nova senha.

Como hash senhas de usuário




As senhas em um aplicativo Web devem ser hash, não criptografadas. Criptografia é um algoritmo bidirecional. A sequência é criptografada, que você pode descriptografar e reutilizar. Essa técnica é frequentemente usada em inteligência para obter informações de aliados.

Hashing sugere que a sequência não pode ser retornada ao texto sem formatação. Esse é o objetivo final de todo o processo.

Para atingir objetivos diferentes, muitos algoritmos foram desenvolvidos: alguns são caracterizados por alta velocidade, outros são altamente confiáveis. Essa tecnologia está em constante evolução e, nos últimos anos, passou por muitas mudanças. Agora vamos considerar as três variedades mais populares em ordem cronológica.

SHA-1


Essa foi historicamente a primeira função de hash. O acrônimo SHA-1 significa "Algoritmo de Hashing Seguro", desenvolvido pela Agência de Segurança Nacional dos EUA.

O SHA-1 era bem conhecido e amplamente utilizado no PHP para criar uma cadeia hexadecimal de 20 bytes com um comprimento de 40 caracteres.

O setor de SSL usa o SHA-1 para assinaturas digitais há vários anos. Depois de identificar alguns pontos fracos, o Google decidiu que era hora de mudar para o SHA-2.
A primeira versão do algoritmo foi preterida em 2005. Posteriormente, novas versões foram desenvolvidas e adotadas para uso: SHA-2, SHA-2 e SHA-256.

Bcrypt


O Bcrypt, não resultado do desenvolvimento natural do SHA, conseguiu atrair um grande público devido ao seu nível de segurança.

Este algoritmo extremamente lento foi criado para criar as seqüências de hash mais seguras. No processo de hash de dados, ele passa por vários ciclos, que na tecnologia de computadores são descritos pelo indicador de custos de mão-de-obra. Quanto maior a taxa de trabalho, mais caro será para um hacker obter uma senha.

Há boas notícias: no futuro, poderemos usar máquinas mais poderosas, capazes de passar mais ciclos mais rapidamente.

Argon2


Este é um novo algoritmo de hash da moda desenvolvido por Alex Biryukov, Daniel Dinu e Dmitry Hovratovich da Universidade do Luxemburgo. Em 2015, ele venceu o Concurso de Hashing de Senhas.

O Argon2 é apresentado em 3 versões:

  1. O Argon2d acessa uma matriz de memória, o que reduz a sobrecarga de memória e tempo. No entanto, ele corre o risco de ser atacado por canais de terceiros.
  2. Argon2i é o oposto de Argônio 2d. É otimizado para ataques a canais de terceiros e acessa a memória de maneira independente da senha.
  3. Argon2id é uma versão intermediária entre duas versões anteriores.

Esta função possui 6 parâmetros: sequência de senha, sal, custo de memória, custo de tempo, fator de paralelismo (número máximo permitido de threads paralelos), comprimento do hash.

Na segunda parte do artigo, mostrarei como usar esse hash no PHP usando as funções integradas, e agora quero convidar todos para o webinar on-line gratuito "PHP sem servidor", no qual nos familiarizaremos com o conceito sem servidor, falaremos sobre sua implementação na AWS, aplicabilidade, preços. Analisaremos os princípios de montagem e lançamento, além de criar um TG-bot simples baseado no AWS Lambda.

Source: https://habr.com/ru/post/pt474754/


All Articles