Punycode es un método de co­di­fi­ca­ción es­ta­n­da­ri­za­do que codifica ca­ra­c­te­res Unicode con un conjunto limitado de ca­ra­c­te­res ASCII. Gracias a este método, se pueden procesar los nombres de dominio in­te­r­na­cio­na­li­za­dos (IDN), que pueden contener ca­ra­c­te­res no ASCII, como la letra “ñ”.

De­sa­rro­llo del método de co­di­fi­ca­ción

En 2003, el Grupo de Trabajo de In­ge­nie­ría de Internet (IETF, del Inglés Internet En­gi­nee­ri­ng Task Force) es­ta­n­da­ri­zó Punycode como sintaxis para la co­di­fi­ca­ción de nombres de dominio in­te­r­na­cio­na­li­za­dos en apli­ca­cio­nes (IDNA).

El IETF define como IDN a aquellos nombres de dominio que contienen ca­ra­c­te­res es­pe­cia­les (como la diéresis, la cedilla o la tilde) o letras no ori­gi­na­les del alfabeto latino (un ejemplo claro es el caso de la ñ). Estos ca­ra­c­te­res no ASCII impiden que pro­to­co­los básicos como el sistema de nombres de dominio (DNS) puedan pro­ce­sar­los.

Así, por ejemplo, desde que se in­tro­du­je­ron los IDN, se admite el nombre de dominio azulejos-coruña en el dominio de nivel superior .es. Sin embargo, en el marco de la re­so­lu­ción de nombres solo podría ser procesado si se realiza la co­di­fi­ca­ción de los ca­ra­c­te­res no básicos (en el ejemplo pre­se­n­ta­do, la “ñ”). Son numerosos los pro­to­co­los que utilizan el lenguaje escrito en inglés y, por lo tanto, solo son co­m­pa­ti­bles con el conjunto limitado de ca­ra­c­te­res ASCII.

Para ga­ra­n­ti­zar la co­m­pa­ti­bi­li­dad de los IDN con los es­tá­n­da­res de Internet más antiguos, el IETF pre­s­cri­bió una co­di­fi­ca­ción para los nombres de dominio in­te­r­na­cio­na­li­za­dos con los ca­ra­c­te­res hasta entonces pe­r­mi­ti­dos, al mismo tiempo que es­ta­n­da­ri­zó el pro­ce­di­mie­n­to co­rre­s­po­n­die­n­te con Punycode.

Nota

En el caso de las di­re­c­cio­nes de correo ele­c­tró­ni­co, la co­di­fi­ca­ción Punycode solo se utiliza con los dominios de correo in­te­r­na­cio­na­li­za­dos. Aquellas di­re­c­cio­nes que contengan ca­ra­c­te­res no ASCII en la parte local, es decir, los ca­ra­c­te­res an­te­rio­res a @, se codifican mediante UTF8.

¿Cómo funciona la co­di­fi­ca­ción Punycode?

Resumen del pro­ce­di­mie­n­to Punycode

El IETF establece en el estándar RFC 3492 que Punycode es una de las posibles apli­ca­cio­nes de un algoritmo de co­di­fi­ca­ción general conocido como Boots­tri­ng. El algoritmo Boots­tri­ng permite re­pre­se­n­tar cadenas de ca­ra­c­te­res con una selección limitada de elementos. En la co­di­fi­ca­ción Punycode, estos elementos se denominan ca­ra­c­te­res básicos, y hacen re­fe­re­n­cia a letras mi­nú­s­cu­las ori­gi­na­les del alfabeto latino, dígitos y el guión (-). El de­sa­rro­llo del pro­ce­di­mie­n­to de co­di­fi­ca­ción se basa en seis pri­n­ci­pios:

  • In­te­gri­dad: con Boots­tri­ng cada cadena de salida puede estar re­pre­se­n­ta­da por una cadena si­m­pli­fi­ca­da.
  • Uni­vo­ci­dad: la cla­si­fi­ca­ción de la cadena de salida y su co­di­fi­ca­ción Boots­tri­ng es ine­quí­vo­ca. A cada Punycode se le puede asignar exac­ta­me­n­te un equi­va­le­n­te en ASCII y viceversa.
  • Re­ve­r­si­bi­li­dad: la co­di­fi­ca­ción mediante Boots­tri­ng puede des­ha­ce­r­se sin perder in­fo­r­ma­ción.
  • Efi­cie­n­cia: la cadena de ca­ra­c­te­res co­di­fi­ca­da solo supera mí­ni­ma­me­n­te en longitud (a veces, ni siquiera) a la cadena de salida.
  • Sencillez: Boots­tri­ng utiliza al­go­ri­t­mos de co­di­fi­ca­ción y de­co­di­fi­ca­ción sencillos.
  • Le­gi­bi­li­dad: solo se codifican aquellos ca­ra­c­te­res que no se pueden re­pre­se­n­tar en el cuerpo de ca­ra­c­te­res de destino. El resto de ca­ra­c­te­res pe­r­ma­ne­cen igual.

Boots­tri­ng es­pe­ci­fi­ca a Punycode de acuerdo con los re­qui­si­tos de los nombres de dominio in­te­r­na­cio­na­li­za­dos. Esto debería permitir re­pre­se­n­tar ca­ra­c­te­res Unicode con los ca­ra­c­te­res básicos pe­r­mi­ti­dos hasta ahora.

Ejemplo

A co­n­ti­nua­ción, mostramos esta sintaxis con el siguiente ejemplo:

IDN: azulejos-coruña

El IDN azulejos-coruña contiene la letra “ñ”, no incluida dentro de los ca­ra­c­te­res antes pe­r­mi­ti­dos para los nombres de dominio y que, por lo tanto, debe co­di­fi­car­se mediante Punycode para ga­ra­n­ti­zar la co­m­pa­ti­bi­li­dad.

Paso 1. No­r­ma­li­za­ción

En el primer paso, el proceso de co­di­fi­ca­ción prevé una no­r­ma­li­za­ción de la cadena de ca­ra­c­te­res de salida (por ejemplo, todas las letras ma­yú­s­cu­las se su­s­ti­tu­yen por mi­nú­s­cu­las).

Paso 2. Eli­mi­na­ción de los ca­ra­c­te­res no básicos

En el segundo paso, se eliminan todos los ca­ra­c­te­res no ASCII, su­s­ti­tu­yé­n­do­los en el dominio por su forma co­di­fi­ca­da y se­pa­rá­n­do­se por un guion.

Al codificar di­re­c­cio­nes de Internet con Punycode, cada cadena re­su­l­ta­n­te va aco­m­pa­ña­da del prefijo ACE (abre­via­tu­ra de ASCII Co­m­pa­ti­ble Encoding):

Prefijo ACE: xn—

El prefijo ACE garantiza que los nombres de dominio que contienen guiones no sean in­te­r­pre­ta­dos erró­nea­me­n­te como nombres de dominio in­te­r­na­cio­na­les.

Fi­na­l­me­n­te, como resultado co­di­fi­ca­do para azulejos-coruña se obtiene:

ACE: xn–azulejos-corua-2nb

Es im­po­r­ta­n­te resaltar que el algoritmo su­b­ya­ce­n­te al método Punycode garantiza que, a pesar de la co­n­ve­r­sión, ninguna de las ca­te­go­rías de dominio excede los 63 ca­ra­c­te­res.

En lo que respecta a la co­di­fi­ca­ción, hay que tener en cuenta que los ca­ra­c­te­res Unicode no se traducen uno a uno a ca­ra­c­te­res ASCII. En su lugar, el algoritmo determina una cadena que resulta de la distancia entre los ca­ra­c­te­res que se han eliminado y de la posición que les co­rre­s­po­n­de en la cadena de salida.

Si volvemos a nuestro ejemplo, la cadena de ca­ra­c­te­res 2nb indica que corua debe co­m­ple­me­n­tar­se con el carácter Unicode “ñ” en la quinta posición.

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

Casos es­pe­cia­les

Las de­s­via­cio­nes de este esquema se producen cuando el nombre de dominio contiene solamente ca­ra­c­te­res no ASCII o no contiene ninguno.

Un nombre de dominio que solo contiene ca­ra­c­te­res no básicos va a mostrar tras el proceso de co­di­fi­ca­ción el prefijo ACE junto a una cadena co­m­ple­ta­me­n­te co­di­fi­ca­da.

Así, por ejemplo, a un nombre de dominio como παράδειγμα (en griego, ejemplo) le co­rre­s­po­n­de la siguiente co­di­fi­ca­ción:

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

ACE: xn–hxajbheg2az3al

Cuando, por el contrario, un nombre de dominio está formado úni­ca­me­n­te por ca­ra­c­te­res ASCII, no se utiliza el pro­ce­di­mie­n­to punycode. Por lo tanto, tampoco se añade un prefijo ACE. La co­di­fi­ca­ción no es necesaria en este caso porque los pro­to­co­los básicos de Internet co­m­pre­n­den sin problemas el nombre de dominio.

Si se considera el nombre de dominio to­ta­l­me­n­te cua­li­fi­ca­do o FQDN (del inglés Fully Qualified Domain Name), se co­di­fi­ca­rá por separado cada una de sus ca­te­go­rías (dominio de nivel superior, dominio de segundo nivel, dominio de tercer nivel, etc.).

Un dominio como пример.бг (búlgaro para ejemplo.bg) podría co­di­fi­car­se como sigue:

IDN: пример.бг

ACE: xn–e1afmkfd.xn–90ae

La siguiente tabla muestra un resumen de las di­fe­re­n­tes variantes del pro­ce­di­mie­n­to Punycode.

IDN Punycode ACE
Ca­ra­c­te­res ASCII y no ASCII azulejos-coruña.es azulejos-corua-2nb.es xn–azulejos-corua-2nb.es
Solo ca­ra­c­te­res no ASCII Παράδειγμα.gr hxajbheg2az3al.gr xn–hxajbheg2az3al.gr
Solo ca­ra­c­te­res ASCII ejemplo.org ejemplo.org- No se aplica
Nota

En el RFC 3492 se describe de manera detallada el algoritmo su­b­ya­ce­n­te a Punycode. El documento también pro­po­r­cio­na una im­ple­me­n­ta­ción del pro­ce­di­mie­n­to de co­di­fi­ca­ción en el lenguaje de pro­gra­ma­ción C.

Para la co­di­fi­ca­ción de nombres de dominio in­te­r­na­cio­na­li­za­dos, los usuarios suelen utilizar Punycode co­n­ve­r­te­rs libres.

Punycode en dominios con emojis

No solo los nombres de dominio in­te­r­na­cio­na­li­za­dos, sino también los dominios con emojis pueden co­di­fi­car­se con Punycode. Como requisito, es necesario que el dominio de nivel superior permita su uso y que el emoticono que se quiera usar esté re­gi­s­tra­do en el estándar Unicode.

Consejo

A día de hoy, son los TLD que aparecen a co­n­ti­nua­ción los que permiten el registro de dominios con emojis: .ws, .tk, .to, .ml, .ga, .cf, .gq y .fm.

Desde un punto de vista técnico, los dominios con emojis se procesan como Punycode, aunque en teoría se presentan ante el usuario como una co­m­bi­na­ción de texto y emo­ti­co­nos.

Dominio con emoji: https://i❤.ws/

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

No obstante, hoy prá­c­ti­ca­me­n­te ningún navegador estándar im­ple­me­n­ta este modelo de dominio. Si in­tro­du­ces un dominio con emoji en Firefox, Chrome, Safari, Edge u Opera, la barra de di­re­c­cio­nes solo muestra la cadena ACE.

Punycode co­n­ve­r­te­rs gratuitos

Son varias las páginas que ofrecen co­n­ve­r­ti­do­res Punycode gratuitos para tra­n­s­fe­rir los IDN en re­pre­se­n­ta­cio­nes co­m­pa­ti­bles con ASCII.

Para el espacio de nombres con dominio de nivel superior .es o .mx se puede nombrar, por ejemplo, el conversor de dominios de la web Cy­be­r­ne­ti­cos. Esta he­rra­mie­n­ta hace hincapié en su capacidad de co­di­fi­ca­ción de ca­ra­c­te­res no ASCII tan ca­ra­c­te­rí­s­ti­cos de la lengua española como la “ñ”, las diéresis o las tildes, aunque también de ca­ra­c­te­res poco ha­bi­tua­les de otros idiomas.

Imagen: Captura de pantalla del Conversor de Dominios de Cyberneticos
Junto a unas sencillas in­s­tru­c­cio­nes, la web de Cy­be­r­ne­ti­cos ofrece un Punycode converter que permite la co­di­fi­ca­ción ACE.

Otro conversor de­s­ta­ca­ble es el Punycode converter de Mathias Bynens basado en punycode.js. Al igual que la he­rra­mie­n­ta antes explicada, este co­n­ve­r­ti­dor se puede aplicar para la co­di­fi­ca­ción de IDN en español, pero también en otras lenguas.

Imagen: Punycode converter de Mathias Bynens basado en punycode.js
Mathias Bynens ofrece con Punycode domain name converter una he­rra­mie­n­ta de código abierto para convertir nombres de dominios in­te­r­na­cio­na­li­za­dos.
Domain Name Re­gi­s­tra­tion
Proyecta tu marca con un gran dominio
  • Gratis SSL Wildcard para tra­n­s­fe­re­n­cias de datos más seguras
  • Gratis registro privado para más pri­va­ci­dad  

¿Co­n­s­ti­tu­ye Punycode un riesgo para la seguridad?

Punycode supone un riesgo para la seguridad en lo que respecta a los ataques ho­mo­grá­fi­cos, un tipo de phishing en el que los de­li­n­cue­n­tes imitan la apa­rie­n­cia de di­fe­re­n­tes ca­ra­c­te­res para atraer a usuarios de­s­pre­ve­ni­dos a web falsas.

Para que los usuarios entiendan este tipo de ataque de phishing, el bloguero Xudong Zheng muestra un ejemplo en su página usando el siguiente Punycode domain:

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

Que dirige a los usuarios a una página con el siguiente IDN:

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

Sin embargo, esta dirección URL no se co­rre­s­po­n­de con la web oficial de la empresa de te­c­no­lo­gía de Ca­li­fo­r­nia Apple Inc., sino con una página web de phishing creada úni­ca­me­n­te a modo de ejemplo.

En lugar del carácter ASCII “a” con Unicode U+0061, se utiliza el carácter cirílico “a” (U+0430). Si bien a simple vista es muy difícil di­fe­re­n­ciar estos dos ca­ra­c­te­res, los na­ve­ga­do­res sí los in­te­r­pre­tan como ca­ra­c­te­res di­fe­re­n­tes.

Además, el hecho de que ni siquiera los ce­r­ti­fi­ca­dos pueden pro­po­r­cio­nar seguridad se convierte en una gran de­s­ve­n­ta­ja para los usuarios. Para las campañas de phishing modernas, los de­li­n­cue­n­tes registran los ce­r­ti­fi­ca­dos SSL válidos, que confieren a la web creada apa­rie­n­cia de seguridad y pro­fe­sio­na­li­dad.

Para evitar este tipo de ataques, las versiones actuales de Chrome y Opera muestran la cadena ACE en lugar del dominio in­te­r­na­cio­na­li­za­do. Internet-Explorer y Microsoft Edge impiden co­m­ple­ta­me­n­te el acceso a este tipo de dominios. Firefox es el único navegador que no ofrece pro­te­c­ción contra el phishing Punycode.

Imagen: Ejemplo de un ataque homográfico
Ejemplo de un dominio ho­mo­grá­fi­co: la dirección URL es vi­sua­l­me­n­te la misma que la del sitio web oficial de Apple. Sin embargo, se ha usado el carácter Unicode U+0430, que se co­rre­s­po­n­de con una letra cirílica con una semejanza asombrosa al carácter ASCII “a”.

Si eres usuario de Firefox, puedes reducir el riesgo de ataques de phishing im­pi­die­n­do la tra­du­c­ción de Punycode a IDN de forma general. Para esta solución temporal solo hay que seguir dos pasos:

  • Acceder a la co­n­fi­gu­ra­ción del editor: escribe about:config en la barra de di­re­c­cio­nes del navegador web para abrir el editor de co­n­fi­gu­ra­ción de Firefox.

  • Obligar a Punycode: busca la co­n­fi­gu­ra­ción network.IDN_show_punycode y cambia el valor de false a true.

Tras la co­n­fi­gu­ra­ción, Firefox mostrará los dominios in­te­r­na­cio­na­li­za­dos en la barra de di­re­c­cio­nes como cadenas ACE.

Domain checker
Ir al menú principal