O Punycode é um método de co­di­fi­ca­ção pa­dro­ni­zado que codifica ca­rac­te­res Unicode uti­li­zando um conjunto limitado de ca­rac­te­res ASCII. Graças a este método, é possível processar nomes de domínio in­ter­na­ci­o­na­li­za­dos (IDN), que podem conter ca­rac­te­res não ASCII, como a letra «ñ».

De­sen­vol­vi­mento do método de co­di­fi­ca­ção

Em 2003, o Grupo de Trabalho de En­ge­nha­ria da Internet (IETF, sigla em inglês para Internet En­gi­ne­e­ring Task Force) pa­dro­ni­zou o Punycode como sintaxe para a co­di­fi­ca­ção de nomes de domínio in­ter­na­ci­o­na­li­za­dos em apli­ca­ções (IDNA).

A IETF define como IDN os nomes de domínio que contêm ca­rac­te­res especiais (como o acento cir­cun­flexo, a cedilha ou o til) ou letras que não fazem parte do alfabeto latino (um exemplo claro é o caso do «ñ»). Estes ca­rac­te­res não ASCII impedem que pro­to­co­los básicos, como o Sistema de Nomes de Domínio (DNS), os consigam processar.

Assim, por exemplo, desde a in­tro­du­ção dos IDN, o nome de domínio azulejos-coruña é admitido no domínio de nível superior .es. No entanto, no âmbito da resolução de nomes, só poderia ser pro­ces­sado se fosse efetuada a co­di­fi­ca­ção dos ca­rac­te­res não básicos (no exemplo apre­sen­tado, o «ñ»). São numerosos os pro­to­co­los que utilizam a linguagem escrita em inglês e, por con­se­guinte, são com­pa­tí­veis apenas com o conjunto limitado de ca­rac­te­res ASCII.

Para garantir a com­pa­ti­bi­li­dade dos IDN com os padrões mais antigos da Internet, a IETF definiu uma co­di­fi­ca­ção para os nomes de domínio in­ter­na­ci­o­na­li­za­dos com os ca­rac­te­res até então per­mi­ti­dos, ao mesmo tempo que pa­dro­ni­zou o pro­ce­di­mento cor­res­pon­dente com o Punycode.

Como funciona a co­di­fi­ca­ção Punycode?

Resumo do pro­ce­di­mento Punycode

A IETF es­ta­be­lece na norma RFC 3492 que o Punycode é uma das possíveis apli­ca­ções de um algoritmo de co­di­fi­ca­ção geral conhecido como Bo­ots­tring. O algoritmo Bo­ots­tring permite re­pre­sen­tar cadeias de ca­rac­te­res com uma seleção limitada de elementos. Na co­di­fi­ca­ção Punycode, estes elementos são de­no­mi­na­dos ca­rac­te­res básicos e referem-se às letras mi­nús­cu­las originais do alfabeto latino, aos al­ga­ris­mos e ao hífen (-). O de­sen­vol­vi­mento do pro­ce­di­mento de co­di­fi­ca­ção baseia-se em seis prin­cí­pios:

  • In­te­gri­dade: com o Bo­ots­tring, cada cadeia de saída pode ser re­pre­sen­tada por uma cadeia sim­pli­fi­cada.
  • Unicidade: a clas­si­fi­ca­ção da cadeia de saída e a sua co­di­fi­ca­ção Bo­ots­tring são inequí­vo­cas. A cada Punycode pode ser atribuído exa­ta­mente um equi­va­lente em ASCII e vice-versa.
  • Re­ver­si­bi­li­dade: a co­di­fi­ca­ção através do Bo­ots­tring pode ser revertida sem perda de in­for­ma­ção.
  • Efi­ci­ên­cia: a cadeia de ca­rac­te­res co­di­fi­cada excede apenas mi­ni­ma­mente em com­pri­mento (por vezes, nem sequer) a cadeia de saída.
  • Sim­pli­ci­dade: o Bo­ots­tring utiliza al­go­rit­mos de co­di­fi­ca­ção e des­co­di­fi­ca­ção simples.
  • Le­gi­bi­li­dade: apenas são co­di­fi­ca­dos os ca­rac­te­res que não podem ser re­pre­sen­ta­dos no conjunto de ca­rac­te­res de destino. Os restantes ca­rac­te­res per­ma­ne­cem inal­te­ra­dos.

O Bo­ots­trap­ping es­pe­ci­fica o Punycode de acordo com os re­qui­si­tos dos nomes de domínio in­ter­na­ci­o­na­li­za­dos. Isto deverá permitir re­pre­sen­tar ca­rac­te­res Unicode uti­li­zando os ca­rac­te­res básicos per­mi­ti­dos até ao momento.

Exemplo

A seguir, apre­sen­ta­mos esta sintaxe com o exemplo a seguir:

IDN: azulejos-coruña

O domínio «azulejos-coruña» contém a letra «ñ», que não faz parte dos ca­rac­te­res an­te­ri­or­mente per­mi­ti­dos para nomes de domínio e que, por isso, deve ser co­di­fi­cada através do Punycode para garantir a com­pa­ti­bi­li­dade.

Passo 1. Nor­ma­li­za­ção

Na primeira etapa, o processo de co­di­fi­ca­ção prevê a nor­ma­li­za­ção da cadeia de ca­rac­te­res de saída (por exemplo, todas as letras maiús­cu­las são subs­ti­tuí­das por mi­nús­cu­las).

Passo 2. Eli­mi­na­ção dos ca­rac­te­res não básicos

Na segunda etapa, todos os ca­rac­te­res não ASCII são removidos, sendo subs­ti­tuí­dos no domínio pela sua forma co­di­fi­cada e separados por um hífen.

Ao codificar endereços de Internet com Punycode, cada cadeia re­sul­tante é acom­pa­nhada pelo prefixo ACE (abre­vi­a­tura de ASCII Com­pa­ti­ble Encoding):

Prefixo ACE: xn—

O prefixo ACE garante que os nomes de domínio que contêm hífens não sejam in­ter­pre­ta­dos er­ro­ne­a­mente como nomes de domínio in­ter­na­ci­o­nais.

Por fim, o resultado co­di­fi­cado para azulejos-coruña é o seguinte:

ACE: xn–azulejos-corua-2nb

É im­por­tante salientar que o algoritmo sub­ja­cente ao método Punycode garante que, apesar da conversão, nenhuma das ca­te­go­rias de domínio exceda os 63 ca­rac­te­res.

No que diz respeito à co­di­fi­ca­ção, é im­por­tante ter em conta que os ca­rac­te­res Unicode não se traduzem, um a um, em ca­rac­te­res ASCII. Em vez disso, o algoritmo determina uma sequência que resulta da distância entre os ca­rac­te­res que foram eli­mi­na­dos e da posição que lhes cor­res­ponde na sequência de saída.

Voltando ao nosso exemplo, a sequência de ca­rac­te­res 2nb indica que «corua» deve ser com­ple­tada com o caractere Unicode «ñ» na quinta posição.

Imagem: Vista de las secciones que componen la cadena ACE
La cadena ACE está formada por el prefijo ACE y una cadena Punycode.

Casos especiais

Os desvios deste esquema ocorrem quando o nome de domínio contém apenas ca­rac­te­res não ASCII ou não contém nenhum.

Um nome de domínio que contenha apenas ca­rac­te­res não básicos apre­sen­tará, após o processo de co­di­fi­ca­ção, o prefixo ACE jun­ta­mente com uma cadeia de ca­rac­te­res to­tal­mente co­di­fi­cada.

Assim, por exemplo, a um nome de domínio como «παράδειγμα» (em grego, «exemplo») cor­res­ponde a seguinte co­di­fi­ca­ção:

IDN: exemplo

ACE: xn–hxajbheg2az3al

Por outro lado, quando um nome de domínio é composto ex­clu­si­va­mente por ca­rac­te­res ASCII, não se recorre ao pro­ce­di­mento Punycode. Por con­se­guinte, também não se adiciona um prefixo ACE. A co­di­fi­ca­ção não é ne­ces­sá­ria neste caso, uma vez que os pro­to­co­los básicos da Internet com­pre­en­dem o nome de domínio sem qualquer problema.

No caso do nome de domínio to­tal­mente qua­li­fi­cado ( FQDN , do inglês Fully Qualified Domain Name), cada uma das suas ca­te­go­rias (domínio de nível superior, domínio de segundo nível, domínio de terceiro nível, etc.) deve ser co­di­fi­cada se­pa­ra­da­mente.

Um domínio como пример.бг (em búlgaro, «exemplo.bg») poderia ser co­di­fi­cado da seguinte forma:

IDN: пример.bg

ACE: xn–e1afmkfd.xn–90ae

A tabela seguinte apresenta um resumo das di­fe­ren­tes variantes do pro­ce­di­mento Punycode.

IDN Punycode ACE
Ca­rac­te­res ASCII e não ASCII azulejos-coruña.es azulejos-corua-2nb.es xn–azulejos-corua-2nb.es
Apenas ca­rac­te­res não ASCII Παράδειγμα.gr hxajbheg2az3al.gr xn–hxajbheg2az3al.gr
Apenas ca­rac­te­res ASCII exemplo.org exemplo.org- Não se aplica
Nota

O RFC 3492 descreve em pormenor o algoritmo sub­ja­cente ao Punycode. O documento também fornece uma im­ple­men­ta­ção do pro­ce­di­mento de co­di­fi­ca­ção na linguagem de pro­gra­ma­ção C.

Para a co­di­fi­ca­ção de nomes de domínio in­ter­na­ci­o­na­li­za­dos, os uti­li­za­do­res costumam recorrer a con­ver­so­res Punycode gratuitos.

Punycode em domínios com emojis

Não só os nomes de domínio in­ter­na­ci­o­na­li­za­dos, mas também os domínios com emojis podem ser co­di­fi­ca­dos com Punycode. Como requisito, é ne­ces­sá­rio que o domínio de nível superior permita a sua uti­li­za­ção e que o emoji que se pretende usar esteja registado na norma Unicode.

Dica

Atu­al­mente, os TLD a seguir permitem o registo de domínios com emojis: .ws, .tk, .to, .ml, .ga, .cf, .gq e .fm.

Do ponto de vista técnico, os domínios com emojis são pro­ces­sa­dos como Punycode, embora, em teoria, sejam apre­sen­ta­dos ao uti­li­za­dor como uma com­bi­na­ção de texto e emojis.

Domínio com emoji: https://i❤.ws/

ACE: https://xn--i-7iq.ws/

No entanto, atu­al­mente, pra­ti­ca­mente nenhum navegador padrão im­ple­menta este modelo de domínio. Se in­tro­du­zir um domínio com emojis no Firefox, Chrome, Safari, Edge ou Opera, a barra de endereços mostra apenas a sequência ACE.

Con­ver­so­res Punycode gratuitos

Existem vários sites que oferecem con­ver­so­res Punycode gratuitos para converter os IDN em re­pre­sen­ta­ções com­pa­tí­veis com ASCII.

No que diz respeito ao espaço de nomes com domínios de nível superior .es ou .mx, podemos citar, por exemplo, o conversor de domínios do site Cy­ber­ne­ti­cos. Esta fer­ra­menta destaca-se pela sua ca­pa­ci­dade de codificar ca­rac­te­res não ASCII tão ca­rac­te­rís­ti­cos da língua espanhola como o «ñ», as tremas ou os acentos, bem como ca­rac­te­res pouco comuns de outras línguas.

Imagem: Captura de pantalla del Conversor de Dominios de Cyberneticos
Junto a unas sencillas ins­truc­ci­o­nes, la web de Cy­ber­ne­ti­cos ofrece un Punycode converter que permite la co­di­fi­ca­ción ACE.

Outro conversor digno de destaque é o Punycode Converter, de Mathias Bynens, baseado no punycode.js. Tal como a fer­ra­menta acima referida, este conversor pode ser utilizado para a co­di­fi­ca­ção de IDN em espanhol, mas também noutras línguas.

Imagem: Punycode converter de Mathias Bynens basado en punycode.js
Mathias Bynens ofrece con Punycode domain name converter una her­ra­mi­enta de código abierto para convertir nombres de dominios in­ter­na­ci­o­na­li­za­dos.

O Punycode re­pre­senta um risco para a segurança?

O Punycode re­pre­senta um risco para a segurança no que diz respeito aos ataques ho­mo­grá­fi­cos, um tipo de phishing em que os cri­mi­no­sos imitam a aparência de di­fe­ren­tes ca­rac­te­res para atrair uti­li­za­do­res de­sa­vi­sa­dos para sites falsos.

Para que os uti­li­za­do­res com­pre­en­dam este tipo de ataque de phishing, o blogueiro Xudong Zheng apresenta um exemplo na sua página uti­li­zando o seguinte domínio Punycode:

https://www.xn--80ak6aa92e.com/

Que re­di­re­ci­ona os uti­li­za­do­res para uma página com o seguinte IDN:

https://www.аррӏе.com/

No entanto, este URL não cor­res­ponde ao site oficial da empresa de tec­no­lo­gia da Ca­li­fór­nia, a Apple Inc., mas sim a uma página de phishing criada apenas a título de exemplo.

Em vez do caractere ASCII «a» com o código Unicode U+0061, utiliza-se o caractere cirílico «a» (U+0430). Embora, à primeira vista, seja muito difícil dis­tin­guir estes dois ca­rac­te­res, os na­ve­ga­do­res in­ter­pre­tam-nos como ca­rac­te­res di­fe­ren­tes.

Além disso, o facto de nem mesmo os cer­ti­fi­ca­dos ga­ran­ti­rem segurança constitui uma grande des­van­ta­gem para os uti­li­za­do­res. Nas campanhas de phishing modernas, os cri­mi­no­sos utilizam cer­ti­fi­ca­dos SSL válidos, o que confere ao site criado uma aparência de segurança e pro­fis­si­o­na­lismo.

Para evitar este tipo de ataques, as versões atuais do Chrome e do Opera apre­sen­tam a sequência ACE em vez do domínio in­ter­na­ci­o­na­li­zado. O Internet Explorer e o Microsoft Edge impedem com­ple­ta­mente o acesso a este tipo de domínios. O Firefox é o único navegador que não oferece proteção contra o phishing Punycode.

Imagem: Ejemplo de un ataque homográfico
Ejemplo de un dominio ho­mo­grá­fico: la dirección URL es vi­su­al­mente la misma que la del sitio web oficial de Apple. Sin embargo, se ha usado el carácter Unicode U+0430, que se cor­res­ponde con una letra cirílica con una semejanza asombrosa al carácter ASCII “a”.

Se é uti­li­za­dor do Firefox, pode reduzir o risco de ataques de phishing de­sa­ti­vando a conversão de Punycode para IDN de forma geral. Para esta solução tem­po­rá­ria, basta seguir dois passos:

  • Aceder às de­fi­ni­ções do editor: escreva about:config na barra de endereços do navegador para abrir o editor de de­fi­ni­ções do Firefox.
  • Forçar o Punycode: procure a con­fi­gu­ra­ção network.IDN_show_punycode e altere o valor de false para true.

Após a con­fi­gu­ra­ção, o Firefox apre­sen­tará os domínios in­ter­na­ci­o­na­li­za­dos na barra de endereços como cadeias ACE.

Ir para o menu principal