04.11
Senhas Irreversíveis
Quando trabalhamos com certos tipos de dados é aconselhável sempre proteger e criptografar antes de inserir essas informações em nossa base de dados, como o que veremos aqui neste post, as senhas. A criptografia de senhas é bastante usada tendo em vista a segurança do sistema e de seus usuários, já que somente a pessoa que cadastrou a senha terá acesso a mesma, pois as melhores técnicas para criptografias de dados como as senhas são as de mão única(one-way), onde você apenas codifica o texto em um hash de caracteres irreversivel.
O que é Sha1?
Este algoritmo recebe como entrada um documento qualquer sob a forma digital com um tamanho de até 2 elevado a 64 bits, e gera como saída um hash de 160 bits, sendo um pouco mais lento que a chave de criptografia MD5, mas em compensação mais difícil de ser quebrado.
Ataque de Dicionários
Basea-se em um ataque em senhas que consiste na criptografia das palavras de um dicionário e posteriormente a comparação com as senhas dos usuários do sistema, desse modo mesmo que sua senha esteja guardada com uma chave de criptografia de mão única como o Sha1, há uma grande possibilidade de sua senha ser descoberta com esse ataque, pois o hash gerado como saída de uma string sempre será o mesmo, como por exemplo a palavra ’salsotto’ que sempre que for gerado um hash criptografado dessa palavra sempre será o mesmo, para posteriormente poder realizar a comparação desse hash.
A comparação entre tentativas senhas criptografadas através de um ataque de dicionário e as senhas previamente armazenadas no banco de dados, seriam facilmente identificadas caso a comparação dos dois hashs criptografados forem iguais.
Melhorando a segurança de seu sistema
Para garantir que as senhas não sejam descobertas tão facilmente, utilizaremos um valor aleatório(salt) juntamente com a senha criptografada, garantindo que se o seu sistema sofra um ataque de dicionários, ele se mostrará muito eficiente contra esse ataque ou qualquer outro tipo de ataque.
Exemplo teórico
Para uso de exemplo teórico, trabalharemos com a palavra ‘criptografia’ sendo a nossa senha, e adicionaremos o salt ao final da mesma, sendo que valor do salt seja criado aleatoriamente, assumiremos que o nosso seja ‘xa23d8eq’ e aplicaremos a chave de criptografia sha1, respectivamente gerando como resultado um hash de 160bits que foi exatamente esse ‘7c2b646d3e5466d14f1873b2883c730c28c9d5d3′. Agora já com o hash e o salt em mãos, só nos falta um valor separador, que no nosso caso será ‘:’ desse modo obtemos a seguinte fórmula:
- [ sha1(senha + salt aleatório) + valor separador + salt aleatório]
- 7c2b646d3e5466d14f1873b2883c730c28c9d5d3:xa23d8eq
Com essa breve introdução com o nosso exemplo, mostrarei agora como criar, armazenar e validar senhas criptografadas com sha1, mas primeiramente será necessário que veja uma função em um post anterior Criando senhas dinâmicas com PHP, pois utilizaremos ela para essa tarefa.
Mãos na massa
Assumindo que criaremos senhas e caracteres randômicos utilizaremos da mesma função para essas atividades, pois em si a função senhaRandomica gera uma string totalmente aleatória, sendo totalmente versátil para as duas tarefas.
1 //gera senha randomica com 8 caracteres2 $senha = senhaRandomica(8);3 4 //gera 6 caracteres randomicos5 $chars_aleatorios = senhaRandomica(6);6 7 //criptografa a senha com sha18 $senha_criptografada = sha1($senha.$chars_aleatorios).",".$chars_aleatorios;
Com essa etapa concluída já podemos armazenar em nosso banco de dados a nossa senha criptografada(não mostrarei como gravar a senha criptografada em nosso banco de dados, pois é simplesmente gravar em um campo do tipo string).
Na validação das senhas é onde devemos prestar mais atenção para entender como será o processo quando for enviado uma tentativa de acesso ao sistema(para o exemplo abaixo, pressuponho que você já tenha um arquivo de conexão com o banco de dados e que faça devidamente a validação dos dados enviados pelo usuário).
01 //login do usuario02 $email = $_POST["email"];03 04 //senha do usuario05 $senha = $_POST["senha"];06 07 //sql para busca usuario atraves do email08 $sql_busca_usuario = "SELECT * FROM user WHERE email='$email'";09 10 //executa a query passada11 $busca_usuario = mysql_query($sql_busca_usuario);12 13 //conta o numero de registros encontrados14 if(mysql_num_rows($busca_usuario) < 0){15 //erro16 }17 18 //guarda os dados do usuario19 $dados_usuario = mysql_fetch_array($busca_usuario);20 21 //separa a senha armazenada no banco através do valor separador22 $senha_criptografada = explode(":",$dados_usuario["senha"]);23 24 //se a senha enviada for igual a armazenada, senha correta25 if(sha1($senha . $senha_criptografada[1]) == $senha_criptografada[0]){26 //senha correta27 } else{28 //senha incorreta29 }
No exemplo acima, é demonstrado dois dados provenientes de uma requisição de um formulário de login(linhas 02 e 05), sendo que o login é o e-mail do próprio usuário e a sua respectiva senha. Em cima dessas duas informações trabalharemos a validação de acesso em noso sistema.
Primeiramente verificaremos se o usuário existe em nossa base de dados, executando uma query de busca a partir do e-mail enviado pelo usuário, caso esse e-mail seja encontrado retornaremos a senha armazenada para o sistema continuar a validação. Agora para verificarmos se as senhas são iguais, separaremos a senha retornada do banco de dados através do valor separador que haviamos definido antes(linha 22) separando o hash do salt, e assim realizaremos a comparação da seguinte forma, pegaremos a senha enviada pelo usuário pelo formulário mais o salt que guardamos da separação realizada anteriormente e aplicaremos a chave de criptografia sha1 em cima da união dessas duas variaveis (senha enviada pelo formulario + salt separado do hash armazenado no banco) e compararemos com o hash que obtivemos pela separação do hash armazenado no banco para ver se são iguais.
Não há comentários ainda.
Deixe seu comentário