Assim como eu me perguntei, acho que muitos dos que estão lendo este artigo, já devem ter se perguntado como é feita a autenticação em redes sem fio. Neste texto, vou descrever o que aprendi ao longo de minha busca por este tipo de informação que, atualmente, encontra-se escassa em nosso idioma.
Como todos já sabem, o
WEP (Wired Equivalent Privacy) se mostrou falho ao longo do tempo, sendo substituído pelo
WPA (Wi-Fi Protected Access) e logo em seguida vieram as suas variantes WPA2(AES), WPA2(TKIP) .
Não irei entrar em detalhes sobre as vulnerabilidades de cada um. As poucas fraquezas relatadas no handshake de autenticação para o WPA/WPA2, já são conhecidos há muito tempo.
Este artigo não revela qualquer coisa que seja novo ou que não tenha sido visto na web. Na verdade, vou fazer referência a outros sites, como RFC's, que podem fornecer mais informações no intuito de mostrar o que é realizado durante o processo de autenticação em baixo nível.
Acima de tudo, escreverei aqui somente um resumo do meu entendimento (de pessoa comum que não atua na área) sobre este processo de autenticação e não uma abordagem técnica. Peço desculpas, de antemão, aos que aqui encontrarem algo fora do contexto geral de autenticação.
Processo de autenticação aberta
As chaves que aqui cito não são as que você usa para abrir a porta da sua casa (instrumento para abrir e fechar uma fechadura), a ideia é a mesma, mas em um contexto diferente. O uso de chaves na criptografia (escrita oculta) vem desde os primórdios da história da humanidade e estão até hoje conosco, pois até certo ponto, funcionam e protegem quando usadas corretamente. As chaves aqui citadas aceitam, ou rejeitam, acesso e ajudam na proteção de dados ou pacotes.
O WPA foi concebido para ser utilizado com um servidor de autenticação 802.1X, que assina diferentes chaves a cada utilizador. Também pode ser usado num ambiente menos seguro com modo Pre-Shared Key (PSK). O PSK que será discutido aqui, está destinado para utilização caseira e em pequenos escritórios, em que cada usuário possui a mesma chave.
O WPA-PSK permite a dispositivo wireless, associar-se a pontos de acesso utilizando o método de encriptação TKIP ou AES. O WPA2-PSK permite o dispositivo wireless associar-se a pontos de acesso utilizando o método de encriptação AES.
TKIP (abreviatura para
Temporal Key Integrity Protocol) é um método de encriptação. O TKIP disponibiliza uma chave que junta a integridade da mensagem e um mecanismo de reenvio de chave.
AES (abreviatura para
Advanced Encryption Standard) é um padrão autorizado de encriptação forte para redes sem fio.
WPA-PSK/WPA2-PSK e TKIP ou AES usam uma "chave pré compartilhada (PSK)" que possui 8 ou mais caracteres de extensão, até um máximo de 63 caracteres.
Quem gerência as redes manualmente no
GNU/Linux e já teve a oportunidade de se conectar a uma rede sem fio conhece o processo de autenticação do "wpa_passphrase" e do "wpa_supplicant"
Processo de autenticação por chaves (PSK)
Antes do processo de autenticação entre o dispositivo (suplicante) e o ponto de acesso (autenticador), na tentativa de provar que os dois conhecem a chave pré compartilhada (PSK), mas sem transmitir a chave pura, será gerado uma "Pairwise-Master-Key (PMK)" .
Ela é derivada da "PSK" (também conhecido como senha) juntamente com outra informação que, no caso, será o SSID. Para realizar o handshake de forma segura, as mensagens são encriptadas com a PMK, pois os dois conhecem a chave e, então, poderão comprovar ao longo do processo.
É necessário entender como os dois sabem a chave. Isso é simples, como a chave (PMK) é derivada da senha e do SSID da rede, seguindo a RFC2898, o resultado sempre será o mesmo, independente de qual máquina esta a gerar a PMK.
A função PBKDF2 é um método padronizado para derivar uma chave de uma frase-senha. Ela é especificada na RFC2898 com uma explicação clara sobre a forma de calculá-la. A função
pbkdf2 precisa de uma outra função pseudo randômica subjacente e, no caso do WPA/WPA2, a função subjacente é HMAC-SHA1.
SHA1 é uma função que calcula um hash de 160 bits a partir de uma quantidade arbitrária de dados de entrada. Ela está claramente explicada na RFC3174.
HMAC é um método padronizado para virar uma função hash de criptografia em uma função de autenticação de mensagem com chave. Ela é especificada na RFC2104.
A ferramenta wpa_passphrase gera uma PMK. Não tive a oportunidade de analisar o código fonte e mesmo que tivesse, linguagem
C para mim ainda é o mesmo que o idioma russo, ainda não entendo quase nada.
Em Python, é outra história, o código a seguir faz basicamente o mesmo trabalho que o utilitário "wpa_passphrase" do GNU/Linux:
from pbkdf2 import PBKDF2
ssid = 'game'
passphrase = '12345678'
key = PBKDF2(passphrase, ssid, 4096).read(32)
PMK = key.hex()
print(PMK)
A saída obtida do código acima, é a mesma obtida com a ferramenta
wpa_passphrase, ou seja, a derivação do SSID + PSK seguindo a RFC2898 obtemos a "Pairwise-Master_Key (PMK)"
Paiwise-Transient-key (PTK)
A criação desta chave necessita da PMK e é feita por outra função pseudo randômica, usando SHA1 mais a combinação do MAC do dispositivo (suplicant) e também do ponto de acesso.
APNounce e Client Nounce (ambos explicados abaixo). A saída é uma string com 512-bits, que é uma concatenação dos valores de cinco chaves separadas, cada uma com seu propósito de uso, sendo elas:
- Key Confirmation Key (KCK)
- Key Encryption Key (KEK)
- Temporal Key (TK)
- MIC Authenticator Tx Key (MIC Tx)
- MIC Authenticator Rx Key (MIC Rx)
handshake
O handshake também é usado para estabelecer uma nova chave Pairwise-Transient-Key (PTK). O resultado é processado por uma função pseudo randômica (Pseudo-Random-Function PRF). Uma outra chave ainda é gerada durante o handshake, que também é usada para descriptografar o tráfego chamada "Group-Temporal-Key (GTK)" . O processo está discutido detalhadamente abaixo.
Quando um dispositivo (suplicante) tenta se conectar ao ponto de acesso, começa o processo conhecido como "4-Way-handshake". Inicialmente, o ponto de acesso transmite uma ANonce key para o suplicante, com o primeiro pacote do handshake; em seguida, o dispositivo (suplicante) constrói um SNounce, juntamente com o "Pairwise-Transient-Key (PTK)" e, então, envia o pacote SNounce e o código de integridade da mensagem (MIC) para o ponto de acesso.
O ponto de acesso gera então a "Group Temporal Key (GTK)" e uma outra sequência de números junto com o (MIC) e envia ao dispositivo suplicante. Finalmente, o dispositivo (suplicante) envia um "acknowledgement (ACK)" para o ponto de acesso confirmando e finalizando o handshake.
Após este processo, já teremos uma conexão "segura".
Conclusão
As redes wireless ainda não estão tão seguras como, às vezes, se espera.
Mas a cada dia que aprendo um pouquinho mais sobre uma função, ou sobre como algo funciona por trás dos bastidores da interface gráfica, fico lisonjeado por essas pessoas terem documentado tal feito para que, futuramente, pessoas como eu pudessem estar aprendendo com o que elas trabalharam duro para fazer.
Mais uma vez venho a citar que este pequeno texto não serve como um artigo técnico e sim se refere ao resumo de um usuário comum, que sentiu dificuldade em achar material em nosso idioma e, então, decidiu compartilhar um pouco do que entendeu ao longo do aprendizado.