Pular para o conteúdo

QR code de Wi-Fi: como funciona e o que ele expõe

Aquele quadradinho colado na parede do café não tem mágica nenhuma dentro: tem uma linha de texto, com o nome da rede e a senha escritos por extenso. Quem fotografa o cartaz leva a senha junto. E isso é o menor dos problemas, porque existem dois padrões para escrever essa linha, e eles discordam justamente nos acentos.

A resposta curta

Um QR de Wi-Fi é uma única linha de texto. A da rede “Café da Vovó”, com a senha “Chocolate2026”, é esta:

WIFI:T:WPA;S:Café da Vovó;P:Chocolate2026;;

Não há criptografia, assinatura nem validade. A senha está ali, legível, e qualquer leitor de QR devolve a linha inteira, inclusive o do seu celular apontado para a foto do cartaz. É por isso que a próxima seção existe antes de qualquer explicação técnica: entender o formato muda o que você imprime.

O que cada pedaço quer dizer

CampoO que éObrigatórioDetalhe
S:Nome da redesimo SSID, exatamente como aparece na lista de redes
P:Senhaquando há senhaem texto puro, sem embaralhar nada
T:Tipo de segurançanãoé onde os dois padrões mais brigam
H:Rede ocultanão“H:true” manda o aparelho procurar uma rede que não se anuncia
R:Transition Disablenãoo campo que existe para dizer “WPA3 e mais nada”
K:Chave pública (SAE-PK)nãosó na norma, e praticamente nenhum gerador escreve

A ordem dos campos não importa: os leitores procuram pelo prefixo, e não pela posição. O que fecha o texto são dois pontos e vírgula seguidos.

Existem dois padrões, e quase ninguém sabe

O formato que todo gerador escreve nasceu em 2010 numa página de wiki da biblioteca ZXing, do Google. Era uma convenção, e não uma norma. Quinze anos depois a Wi-Fi Alliance padronizou o assunto na Seção 7 da WPA3™ Specification v3.5, com gramática formal e tudo. O detalhe é que ela padronizou outra coisa.

Que os dois convivem não é opinião nossa: o próprio Android chama o formato pelo nome do dialeto no código-fonte que lê o QR. A constante se chama SCHEME_ZXING_WIFI_NETWORK_CONFIG e o comentário acima dela cita, como especificação, a página de wiki do ZXing.

AssuntoConvenção ZXing (o que os aparelhos leem)Norma WPA3 §7.1 (o que está escrito)
Caractere especialbarra invertida: \; \, \: \" \\percent-encoding: %3B
Acento e emojivão crus, em UTF-8percent-encoding octeto a octeto
Rede abertaT:nopasssem campo T nenhum
WPA3T:SAET:WPA mais R:1
WEPT:WEPnão definido pela norma

A linha do WEP não é descuido da norma: ela escreve, com todas as letras, que “esta especificação não define o uso do URI WIFI com chave compartilhada WEP”.

A medição: 113 caracteres, um por um

Para saber o tamanho do estrago, colocamos cada caractere dentro de um nome de rede, escrevemos esse nome nos dois dialetos e lemos o resultado com os dois leitores. A varredura é exaustiva no ASCII imprimível, os 95 caracteres do espaço ao til, mais 18 letras acentuadas e sinais que aparecem em nome de rede em português.

Em 90 dos 113 os dois padrões escrevem exatamente a mesma coisa, e é por isso que ninguém percebe o problema: uma rede chamada “CASA 5G” sai idêntica nos dois. A divergência aparece nos outros 23, e ela não é simétrica.

Se você seguir……e o código for lido por…Caracteres que dão nome errado
a norma oficialum celular Android20 de 113
a convenção do ZXingum leitor estrito da norma5 de 113

Os 5 do segundo caso são os reservados que a convenção escapa com barra: " , : ; \. Os 20 do primeiro são um problema maior, porque incluem toda letra acentuada: ; \ á â ã à ç é ê í ó ô õ ú ü ñ º ª – 🍕.

Escrito por extenso: a norma que a Wi-Fi Alliance publicou em 2025 manda codificar o “é” de “Café” como %C3%A9, e o Android não desfaz essa codificação. No arquivo que faz a leitura não existe uma única passagem de percent-decoding. O nome da rede chega com os símbolos dentro, o aparelho procura uma rede que não existe, e a conexão falha sem dizer por quê.

O que o celular entende, na prática

Quatro redes com nome de rede brasileira, escritas exatamente como a norma manda, e o que sai do outro lado. A última coluna não é opinião: é o resultado do leitor do Android, transcrito do código-fonte dele.

RedeEscrito pela normaO que o Android entende
Café da VovóWIFI:T:WPA;S:Caf%C3%A9 da Vov%C3%B3;P:Chocolate2026;;Caf%C3%A9 da Vov%C3%B3 (nome)
Salão da SimoneWIFI:T:WPA;S:Sal%C3%A3o da Simone;P:Beleza@2026;;Sal%C3%A3o da Simone (nome)
Casa;da SimoneWIFI:T:WPA;S:Casa%3Bda Simone;P:Pizza2026;;Casa%3Bda Simone (nome)
Rede do BarWIFI:T:WPA;S:Rede do Bar;P:a"b,c:d\e;;a"b,c:de (senha)

A última linha é a mais traiçoeira das quatro: o nome sai inteiro, e é a senha que perde a barra invertida pelo caminho: o Android trata barra como escape e engole a que a norma mandou deixar crua. Um cartaz desses funciona para metade das pessoas e falha para a outra metade, sem nenhuma mensagem de erro.

E o código fica maior?

Essa era a nossa aposta antes de medir, e ela não se confirmou. O percent-encoding infla o texto, porque cada letra acentuada vira seis caracteres. Só que o QR cresce em degraus, e o inchaço raramente chega a subir um degrau. Os três exemplos abaixo saíram do encoder da ferramenta daqui, no nível de correção M.

RedeBytes (ZXing)Bytes (norma)Versão do símbolo
VIVOFIBRA-8C2140403 nos dois
Café da Vovó 5G48564 nos dois
Salão da Simone45494 nos dois

O maior acréscimo foi de 8 bytes, e em nenhum dos três a versão do símbolo mudou. Ou seja: o custo de escolher o dialeto errado não é tamanho, é compatibilidade. O código sai igualzinho e não conecta.

O que testamos, e o que não testamos

Geramos 10 símbolos com o encoder deste site: cinco redes nos dois dialetos, incluindo uma com emoji no nome e outra com barra invertida na senha. Gravamos tudo em PNG e mandamos ler pelo detector de QR do próprio macOS. Os 10 voltaram com a linha idêntica, caractere por caractere.

Isso prova um elo: o texto atravessa o desenho inteiro e sai igual do outro lado. Não prova o elo seguinte, que é como cada celular interpreta esse texto, e é exatamente aí que os dois dialetos brigam. Para esse pedaço a evidência é o código-fonte do Android, lido linha a linha, e não um aparelho na bancada: não há iPhone nem Android neste ambiente, então nada aqui foi confirmado numa tela de celular. E a Apple não publica especificação nenhuma do formato que a câmera dela lê. Isso também é um achado, e é a razão de este artigo não afirmar nada sobre o comportamento do iOS.

Também não contamos quantos geradores da primeira página de busca usam cada dialeto. Dá para você mesmo conferir em dez segundos: gere o código no site que quiser, leia com qualquer leitor de QR e olhe se o nome da rede aparece com acento ou com %C3%A9.

A senha está na parede, e ela não expira

Um QR de Wi-Fi é a senha impressa em código de barras. Não tem criptografia, não tem prazo, não tem “só uma vez”. Quem tirar foto do cartaz leva a rede embora, e quem passar na calçada com zoom também. Isso não é defeito do formato: é o formato.

Ele também não tem como ser revogado. Só reimprimindo.

O que muda o jogo é qual senha está lá. Se o seu roteador tem rede de convidados, o cartaz é dela, e a rede principal, onde estão o computador, as câmeras e a impressora, fica sem cartaz nenhum. Trocar a senha de visitante depois de uma festa custa reimprimir uma folha; trocar a principal custa reconfigurar tudo que estava conectado.

Rede oculta não fica escondida do cartaz

O campo H:true serve para redes que não anunciam o nome: ele manda o aparelho procurar ativamente, em vez de esperar. Sem esse campo, um QR de rede oculta simplesmente não conecta. Esconder o nome nunca foi segurança: o aparelho passa a sair gritando o nome da rede por aí para achá-la, e agora o nome também está no cartaz.

“T:WPA3” não existe

É o erro mais comum de quem escreve o código à mão. Na convenção que os aparelhos leem, WPA3 se diz T:SAE; na norma, não se diz assim: escreve-se T:WPA mais R:1, que é o campo Transition Disable e significa “configure só WPA3, sem cair para o modo antigo”. Escrever T:WPA3 produz um código que alguns leitores recusam e outros interpretam como rede aberta.

Para rede sem senha, os dois discordam de novo: a convenção escreve T:nopass e a norma manda omitir o campo. O quarto exemplo da própria norma é literalmente WIFI:S:MyNet;;.

O buraco que a norma deixou aberto

Lendo a gramática ao pé da letra aparece uma ambiguidade que ninguém comenta: o conjunto de caracteres “imprimíveis” da norma inclui o próprio sinal de porcentagem. Ou seja, a regra não manda escapá-lo. O resultado é que uma rede chamada literalmente 100%3Bteste fica indistinguível de uma rede chamada 100;teste depois de codificada, e não há informação no código que permita ao leitor decidir qual é qual.

Por que isso importa mais no Brasil

Porque nome de rede aqui tem acento. “Salão”, “Café”, “Ateliê”, “São Judas”, o sobrenome da família com til. Nos 113 caracteres que varremos, o grupo que quebra é exatamente esse. Em inglês, o mesmo cartaz funcionaria nos dois dialetos e o problema nunca apareceria, o que ajuda a explicar por que ele não é discutido.

O conselho prático que sai da medição é curto: se você vai imprimir um cartaz, use um nome de rede sem acento e sem os cinco caracteres reservados (\ ; , " :). Não é elegante, é o que sobrevive aos dois padrões ao mesmo tempo. Se o nome já tem acento e você não vai mudá-lo, gere pelo dialeto do ZXing, que é o que os aparelhos leem hoje, e teste antes de colar na parede. Tirar acento de um texto tem outras armadilhas, e elas estão em outro artigo daqui.

Como fazer o seu

Monte a linha e coloque no gerador de QR code deste site. Para a rede do exemplo, o texto a colar é este:

WIFI:T:WPA;S:Café da Vovó;P:Chocolate2026;;

Duas observações que valem o parágrafo. A primeira: o gerador daqui desenha o código no seu navegador, então a senha do seu Wi-Fi não passa por servidor nenhum, o que não é detalhe quando o dado é literalmente uma senha. A segunda: leia o próprio código antes de imprimir, com qualquer leitor, e confira se o nome da rede aparece do jeito que você escreveu. É o teste de trinta segundos que este artigo inteiro está pedindo.

Se nesse teste o código não for lido de jeito nenhum, o problema é outro e tem artigo próprio aqui: por que um QR code não lê.

E se quiser ver a mesma linha escrita como a norma manda, para comparar: WIFI:T:WPA;S:Caf%C3%A9 da Vov%C3%B3;P:Chocolate2026;;

Fontes

  • WPA3™ Specification v3.5, Wi-Fi Alliance, 2025. Seção 7 (“WIFI URI”), com a gramática formal, a regra de percent-encoding e os quatro exemplos. Lida em PDF; os quatro exemplos são fixtures do teste desta página.
  • Barcode Contents, wiki do projeto ZXing: a convenção de 2010, com a tabela de campos e a regra de escape por barra invertida. O exemplo de escape que ela publica também virou teste aqui.
  • WifiUriParser.java, AOSP: o código que o Android roda ao ler um QR de Wi-Fi. O leitor usado na medição desta página é transcrição dele, e é lá que se vê que não existe percent-decoding.

Medição conferida em 9 de agosto de 2026. Se algum dos dois padrões mudar, os números desta página caem no build antes de chegarem a você. É para isso que as travas existem.