2009
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 caracteres
2
$senha = senhaRandomica(8);
3
 
4
//gera 6 caracteres randomicos
5
$chars_aleatorios = senhaRandomica(6);
6
 
7
//criptografa a senha com sha1
8
$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 usuario
02
$email = $_POST["email"];
03
 
04
//senha do usuario
05
$senha = $_POST["senha"];
06
 
07
//sql para busca usuario atraves do email
08
$sql_busca_usuario = "SELECT * FROM user WHERE email='$email'";
09
 
10
//executa a query passada
11
$busca_usuario = mysql_query($sql_busca_usuario);
12
 
13
//conta o numero de registros encontrados
14
if(mysql_num_rows($busca_usuario) < 0){
15
    //erro
16
}
17
 
18
//guarda os dados do usuario
19
$dados_usuario = mysql_fetch_array($busca_usuario);
20
 
21
//separa a senha armazenada no banco através do valor separador
22
$senha_criptografada = explode(":",$dados_usuario["senha"]);
23
 
24
//se a senha enviada for igual a armazenada, senha correta
25
if(sha1($senha . $senha_criptografada[1]) == $senha_criptografada[0]){
26
    //senha correta
27
} else{
28
    //senha incorreta
29
}

 

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.

Também não deixe de ler:

Não há comentários ainda.

Deixe seu comentário