Punycode é um protocolo de co­di­fi­ca­ção pa­dro­ni­zado, que trans­forma cadeias de ca­rac­te­res Unicode em cadeias de ca­rac­te­res ASCII. Isso permite que nomes de domínio in­ter­na­ci­o­na­li­za­dos (IDNs) contenham ca­rac­te­res não ASCII, como tremas.

De­sen­vol­vi­mento do protocolo de co­di­fi­ca­ção Punycode

O protocolo do Punycode foi pa­dro­ni­zado em 2003 pela IETF (Internet En­gi­ne­e­ring Task Force), como a sintaxe a ser aplicada na co­di­fi­ca­ção de IDNs (Nomes de Domínio In­ter­na­ci­o­na­li­za­dos). É im­por­tante es­cla­re­cer que a IETF define IDNs como nomes de domínio que contêm ca­rac­te­res não latinos, como tremas ou outros símbolos usados por alguns idiomas es­tran­gei­ros. Estes são in­com­pa­tí­veis com pro­to­co­los básicos, como os do Sistema de Nomes de Domínio (DNS), não podendo, assim, serem pro­ces­sa­dos.

Um nome de domínio alemão, como müller-büromöbel, pode ser re­gis­trado sob o domínio nacional de nível superior (ccTLD) .de, desde a liberação de IDNs. En­tre­tanto, este domínio precisa passar por um processo de co­di­fi­ca­ção para ir à resolução de nomes. Como grande parte dos pro­to­co­los da internet são baseados no idioma inglês, eles só suportam conjuntos limitados de ca­rac­te­res ASCII.

Para garantir que IDNs sejam com­pa­tí­veis também com padrões mais antigos da internet, o IETF estipulou que nomes de domínio in­ter­na­ci­o­na­li­za­dos devem ser co­di­fi­ca­dos uti­li­zando somente esses ca­rac­te­res limitados. Para pa­dro­ni­zar a co­di­fi­ca­ção, um protocolo nomeado de Punycode foi criado.

Nota

Para endereços de e-mail, o Punycode é aplicado somente a domínios de e-mail in­ter­na­ci­o­na­li­za­dos. Já a parte local (antes do @) é co­di­fi­cada por UTF-8 quando contém ca­rac­te­res não ASCII.

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

Resumo do protocolo Punycode

O protocolo Punycode, definido pelo IETF, pode ser en­con­trado em RFC 3492. Ele define como aplicar um algoritmo de co­di­fi­ca­ção geral, boostring, que permite que strings de conjuntos de ca­rac­te­res ar­bi­trá­rios sejam mapeadas ex­clu­si­va­mente por uma seleção definida de elementos. Na co­di­fi­ca­ção Punycode, estes elementos são chamados deca­rac­te­res base e compostos de letras mi­nús­cu­las, dígitos e hifens (-).

O de­sen­vol­vi­mento do protocolo de co­di­fi­ca­ção Punycode foi baseado em seis prin­cí­pios:

  • Com­ple­tude: Cada string de saída pode ser mapeada como string sim­pli­fi­cada por bo­ots­tring.
  • Ex­clu­si­vi­dade: A atri­bui­ção da string de saída à res­pec­tiva co­di­fi­ca­ção bo­ots­tring é exclusiva. A cada Punycode é atribuída exa­ta­mente uma con­tra­parte ASCII, e vice-versa.
  • Re­ver­si­bi­li­dade: A co­di­fi­ca­ção da string inicial pode ser revertida a qualquer momento, sem que haja qualquer perda de in­for­ma­ção.
  • Efi­ci­ên­cia: A cadeia co­di­fi­cada pode ser, se ne­ces­sá­rio, mi­ni­ma­mente mais longa que a cadeia original.
  • Sim­pli­ci­dade: O bo­ots­tring utiliza al­go­rit­mos simples de co­di­fi­ca­ção e de­co­di­fi­ca­ção.
  • Le­gi­bi­li­dade: Somente ca­rac­te­res que não podem ser re­pre­sen­ta­dos pelo conjunto de ca­rac­te­res básicos são co­di­fi­ca­dos. Todos os outros per­ma­ne­cem inal­te­ra­dos.

O Punycode es­pe­ci­fica o bo­ots­tring a ser usado, levando em conta os re­qui­si­tos para nomes de domínio in­ter­na­ci­o­na­li­za­dos. Assim, o ma­pe­a­mento de ca­rac­te­res Unicode se sobrepõe ao de ca­rac­te­res básicos (e per­mi­ti­dos).

Exemplo

Observe o seguinte exemplo de co­di­fi­ca­ção Punycode:

IDN: müller-büromöbel

O nome de domínio in­ter­na­ci­o­na­li­zado müller-büromöbel contém dois ca­rac­te­res, ü e ö, que não são atu­al­mente per­mi­ti­dos para nomes de domínio. Assim sendo, eles devem ser co­di­fi­ca­dos por Punycode para que passem a ser com­pa­tí­veis.

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

O primeiro passo do pro­ce­di­mento de co­di­fi­ca­ção prevê a nor­ma­li­za­ção da cadeia de ca­rac­te­res inicial. Assim, todas as letras maiús­cu­las são subs­ti­tuí­das pelas letras mi­nús­cu­las cor­res­pon­den­tes. Outros ca­rac­te­res não básicos também passam por um processo de resolução.

Passo 2: Eli­mi­na­ção de todos os ca­rac­te­res não básicos

Na segunda etapa, todos os ca­rac­te­res não básicos são excluídos e adi­ci­o­na­dos ao nome de domínio em formato co­di­fi­cado, separados por um hífen.

Se o protocolo Punycode for usado para codificar endereços web, cada string de resultado será fornecida com o chamado prefixo ACE (abre­vi­a­ção de ASCII Com­pa­ti­ble Encoding, ou Co­di­fi­ca­ção Com­pa­tí­vel com ASCII):

Prefixo ACE: xn–

O prefixo ACE garante que nomes de domínio que sim­ples­mente contêm hifens não sejam in­ter­pre­ta­dos er­ro­ne­a­mente como nomes de domínio in­ter­na­ci­o­na­li­za­dos.

Assim, o IDN müller-büromöbel passará a ter a seguinte co­di­fi­ca­ção:

ACE: xn–mller-brombel-rmb4fg

In­te­res­sante observar o algoritmo associado ao protocolo Punycode. Ele garante que, apesar da conversão, nenhum dos rótulos de domínio exceda o com­pri­mento máximo de 63 ca­rac­te­res.

Durante o processo de co­di­fi­ca­ção, ca­rac­te­res Unicode não são con­ver­ti­dos, um por um, em ca­rac­te­res ASCII. Em vez disso, o algoritmo calcula a cadeia de ca­rac­te­res baseando-se na distância entre os ca­rac­te­res excluídos e a posição dos ca­rac­te­res na cadeia de saída.

No nosso exemplo, a cadeia rmb4fg indica que mller-brombel deve ser com­ple­men­tado com os ca­rac­te­res Unicode ü e ö na segunda e na sétima casa.

Imagem: Partes de uma string ACE
Uma string ACE é composta de um prefixo ACE e de uma string co­di­fi­cada por Punycode

Exceções

Domínios que não contém nenhum caractere básico, ou somente ca­rac­te­res não básicos, são tratados de forma especial.

Um nome de domínio que só utiliza ca­rac­te­res não básicos exibe apenas a cadeia de ca­rac­te­res co­di­fi­cada e o prefixo ACE após o processo de co­di­fi­ca­ção. O nome de domínio παράδειγμα (“exemplo” escrito em grego) passaria a ter a seguinte co­di­fi­ca­ção:

IDN: παράδειγμα

ACE: xn–hxajbheg2az3al

Se um nome de domínio contiver apenas ca­rac­te­res básicos, ele não passa por uma co­di­fi­ca­ção Punycode e, por isso, não ganha um prefixo ACE. A co­di­fi­ca­ção não é ne­ces­sá­ria neste caso, porque o nome de domínio já é com­pa­tí­vel com os pro­to­co­los básicos da internet.

Se ob­ser­var­mos a in­te­gra­li­dade do Nome de Domínio To­tal­mente Qua­li­fi­cado (FQDN), veremos que cada rótulo (domínio de nível superior, domínio de segundo nível, domínio de terceiro nível etc.) é co­di­fi­cado se­pa­ra­da­mente. O domínio fictício пример.бг (búlgaro para exemplo.bg) seria, portanto, co­di­fi­cado da seguinte forma:

IDN: пример.бг

ACE: xn–e1afmkfd.xn–90ae

A tabela abaixo exem­pli­fica algumas variações do protocolo Punycode

IDN Punycode ACE
Ca­rac­te­res básicos e não básicos müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Só ca­rac­te­res não básicos Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Só ca­rac­te­res básicos exemplo.org exemplo.org Não é utilizado
Nota

O algoritmo associado ao Punycode é descrito, em detalhes, pelo documento RFC 3492. Além disso, ele exem­pli­fica a im­ple­men­ta­ção deste protocolo de co­di­fi­ca­ção uti­li­zando a linguagem de pro­gra­ma­ção C.

A maioria das pessoas utiliza con­ver­so­res de Punycode (Punycode converter) gratuitos ao codificar nomes de domínio in­ter­na­ci­o­na­li­za­dos.

Punycode para codificar domínios com emoji

Não apenas nomes de domínio in­ter­na­ci­o­na­li­za­dos, mas também domínios com emoji podem ser re­sol­vi­dos pelo Punycode. Contudo, para que a conversão seja possível, o res­pec­tivo domínio de nível superior deve permitir o uso de emojis. Da mesma forma, o emoji desejado deve ter sido re­gis­trado também em padrão Unicode para funcionar.

Tec­ni­ca­mente, domínios com emoji são pro­ces­sa­dos pelo Punycode. Contudo, neste caso, o endereço web deve ser exibido com­bi­nando texto e emoji.

Emoji-Domain: https://i❤.ws/

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

Atu­al­mente, nenhum navegador padrão, como Firefox, Chrome, Safari, Edge e Opera, suporta a exibição de domínios com emoji. Caso você insira um deles na barra de endereços, este será exibido como sequência ACE.

Punycode converter gratuito

Você pode encontrar diversos Punycode converter na internet, que traduzem IDNs em re­pre­sen­ta­ções com­pa­tí­veis com ASCII gra­tui­ta­mente.

O site Punycoder.com, por exemplo, converte nomes de domínio in­ter­na­ci­o­na­li­za­dos em cadeias de ca­rac­te­res ASCII. Ainda, ele é capaz de fazer a conversão oposta, tra­du­zindo cadeias ASCII em cadeias Unicode com fa­ci­li­dade.

Imagem: Punycode converter do Punycoder.com
O Punycoder resolve nomes IDNs em ASCII

Também re­co­men­da­mos o Punycode converter by Mathias Bynens, que é baseado em punycode.js.

Imagem: O Punycode converter desenvolvido por Mathias Bynens usa punycode.js
Fer­ra­menta de código aberto converte nomes de domínio in­ter­na­ci­o­na­li­za­dos

Quais são os riscos do Punycode?

O Punycode é es­pe­ci­al­mente vul­ne­rá­vel a ataques ho­mo­grá­fi­cos, um crime ci­ber­né­tico de phishing no qual hackers tiram proveito da se­me­lhança entre ca­rac­te­res para atrair vítimas de­sa­vi­sa­das a sites falsos. O blogueiro Xudong Zheng mostra como aparenta um ataque de phishing que faz uso de um Punycode URL. O exemplo dele utiliza o Punycode URL https://www.xn--80ak6aa92e.com/, que leva usuários da internet a um site com o seguinte IDN: https://www.аррӏе.com/.

O problema é que o Punycode URL acima não cor­res­ponde ao site oficial da empresa es­ta­du­ni­dense de tec­no­lo­gia Apple Inc., mas a um site de phishing criado para fins de de­mons­tra­ção.

Em vez do caractere ASCII a (Unicode U+0061) o a cirílico é usado (U+0430). Difíceis de serem di­fe­ren­ci­a­dos a olho nu, eles são in­ter­pre­ta­dos de maneira to­tal­mente diferente pelos na­ve­ga­do­res, o que é uma grande des­van­ta­gem do sistema. Cer­ti­fi­ca­dos também não garantem a segurança, pois cri­mi­no­sos costumam emitir cer­ti­fi­ca­dos SSL válidos para sites de phishing modernos, o que transmite ainda mais a impressão de le­gi­ti­mi­dade.

Imagem: Exemplo de um ataque homográfico
Exemplo de domínio ho­mo­grá­fico: o URL cor­res­ponde vi­su­al­mente ao do site oficial da Apple, mas, na verdade, o caractere cirílico Unicode U+0430 é usado ao invés do caractere ASCII a. Ambos são in­cri­vel­mente parecidos.

Usuários do navegador Firefox podem se proteger deste tipo de ataque. Para reduzir o risco de phishing ho­mo­grá­fico, impeça a tradução Punycode de IDNs. Siga estes dois passos:

  1. Acesse o editor de con­fi­gu­ra­ção: Digite about:config na barra de endereços do navegador para abrir o editor de con­fi­gu­ra­ção do Firefox.
  2. Altere o Punycode: Encontre a con­fi­gu­ra­ção network.IDN_show_punycode e modifique o valor de false para true.

Se você fizer isso, seu navegador Firefox passará a exibir domínios in­ter­na­ci­o­na­li­za­dos como cadeias de ca­rac­te­res ACE na barra de endereços.

Consulta de Domínio
Ir para o menu principal