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
| Campo | O que é | Obrigatório | Detalhe |
|---|---|---|---|
| S: | Nome da rede | sim | o SSID, exatamente como aparece na lista de redes |
| P: | Senha | quando há senha | em texto puro, sem embaralhar nada |
| T: | Tipo de segurança | não | é onde os dois padrões mais brigam |
| H: | Rede oculta | não | “H:true” manda o aparelho procurar uma rede que não se anuncia |
| R: | Transition Disable | não | o campo que existe para dizer “WPA3 e mais nada” |
| K: | Chave pública (SAE-PK) | não | só 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.
| Assunto | Convenção ZXing (o que os aparelhos leem) | Norma WPA3 §7.1 (o que está escrito) |
|---|---|---|
| Caractere especial | barra invertida: \; \, \: \" \\ | percent-encoding: %3B |
| Acento e emoji | vão crus, em UTF-8 | percent-encoding octeto a octeto |
| Rede aberta | T:nopass | sem campo T nenhum |
| WPA3 | T:SAE | T:WPA mais R:1 |
| WEP | T:WEP | nã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 oficial | um celular Android | 20 de 113 |
| a convenção do ZXing | um leitor estrito da norma | 5 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.
| Rede | Escrito pela norma | O 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 Simone | WIFI:T:WPA;S:Sal%C3%A3o da Simone;P:Beleza@2026;; | Sal%C3%A3o da Simone (nome) |
| Casa;da Simone | WIFI:T:WPA;S:Casa%3Bda Simone;P:Pizza2026;; | Casa%3Bda Simone (nome) |
| Rede do Bar | WIFI: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.
| Rede | Bytes (ZXing) | Bytes (norma) | Versão do símbolo |
|---|---|---|---|
| VIVOFIBRA-8C21 | 40 | 40 | 3 nos dois |
| Café da Vovó 5G | 48 | 56 | 4 nos dois |
| Salão da Simone | 45 | 49 | 4 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.