Punycode: conversión de dominios internacionalizados

Punycode es un método de codificación estandarizado que codifica caracteres Unicode con un conjunto limitado de caracteres ASCII. Gracias a este método, se pueden procesar los nombres de dominio internacionalizados (IDN), que pueden contener caracteres no ASCII, como la letra “ñ”.

Desarrollo del método de codificación

En 2003, el Grupo de Trabajo de Ingeniería de Internet (IETF, del Inglés Internet Engineering Task Force) estandarizó Punycode como sintaxis para la codificación de nombres de dominio internacionalizados en aplicaciones (IDNA).

El IETF define como IDN a aquellos nombres de dominio que contienen caracteres especiales (como la diéresis, la cedilla o la tilde) o letras no originales del alfabeto latino (un ejemplo claro es el caso de la ñ). Estos caracteres no ASCII impiden que protocolos básicos como el sistema de nombres de dominio (DNS) puedan procesarlos.

Así, por ejemplo, desde que se introdujeron 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 resolución de nombres solo podría ser procesado si se realiza la codificación de los caracteres no básicos (en el ejemplo presentado, la “ñ”). Son numerosos los protocolos que utilizan el lenguaje escrito en inglés y, por lo tanto, solo son compatibles con el conjunto limitado de caracteres ASCII.

Para garantizar la compatibilidad de los IDN con los estándares de Internet más antiguos, el IETF prescribió una codificación para los nombres de dominio internacionalizados con los caracteres hasta entonces permitidos, al mismo tiempo que estandarizó el procedimiento correspondiente con Punycode.

Nota

En el caso de las direcciones de correo electrónico, la codificación Punycode solo se utiliza con los dominios de correo internacionalizados. Aquellas direcciones que contengan caracteres no ASCII en la parte local, es decir, los caracteres anteriores a @, se codifican mediante UTF8.

¿Cómo funciona la codificación Punycode?

Resumen del procedimiento Punycode

El IETF establece en el estándar RFC 3492 que Punycode es una de las posibles aplicaciones de un algoritmo de codificación general conocido como Bootstring. El algoritmo Bootstring permite representar cadenas de caracteres con una selección limitada de elementos. En la codificación Punycode, estos elementos se denominan caracteres básicos, y hacen referencia a letras minúsculas originales del alfabeto latino, dígitos y el guión (-). El desarrollo del procedimiento de codificación se basa en seis principios:

  • Integridad: con Bootstring cada cadena de salida puede estar representada por una cadena simplificada.
  • Univocidad: la clasificación de la cadena de salida y su codificación Bootstring es inequívoca. A cada Punycode se le puede asignar exactamente un equivalente en ASCII y viceversa.
  • Reversibilidad: la codificación mediante Bootstring puede deshacerse sin perder información.
  • Eficiencia: la cadena de caracteres codificada solo supera mínimamente en longitud (a veces, ni siquiera) a la cadena de salida.
  • Sencillez: Bootstring utiliza algoritmos de codificación y decodificación sencillos.
  • Legibilidad: solo se codifican aquellos caracteres que no se pueden representar en el cuerpo de caracteres de destino. El resto de caracteres permanecen igual.

Bootstring especifica a Punycode de acuerdo con los requisitos de los nombres de dominio internacionalizados. Esto debería permitir representar caracteres Unicode con los caracteres básicos permitidos hasta ahora.

Ejemplo

A continuació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 caracteres antes permitidos para los nombres de dominio y que, por lo tanto, debe codificarse mediante Punycode para garantizar la compatibilidad.

Paso 1. Normalización

En el primer paso, el proceso de codificación prevé una normalización de la cadena de caracteres de salida (por ejemplo, todas las letras mayúsculas se sustituyen por minúsculas).

Paso 2. Eliminación de los caracteres no básicos

En el segundo paso, se eliminan todos los caracteres no ASCII, sustituyéndolos en el dominio por su forma codificada y separándose por un guion.

Al codificar direcciones de Internet con Punycode, cada cadena resultante va acompañada del prefijo ACE (abreviatura de ASCII Compatible Encoding):

Prefijo ACE: xn—

El prefijo ACE garantiza que los nombres de dominio que contienen guiones no sean interpretados erróneamente como nombres de dominio internacionales.

Finalmente, como resultado codificado para azulejos-coruña se obtiene:

ACE: xn–azulejos-corua-2nb

Es importante resaltar que el algoritmo subyacente al método Punycode garantiza que, a pesar de la conversión, ninguna de las categorías de dominio excede los 63 caracteres.

En lo que respecta a la codificación, hay que tener en cuenta que los caracteres Unicode no se traducen uno a uno a caracteres ASCII. En su lugar, el algoritmo determina una cadena que resulta de la distancia entre los caracteres que se han eliminado y de la posición que les corresponde en la cadena de salida.

Si volvemos a nuestro ejemplo, la cadena de caracteres 2nb indica que corua debe complementarse con el carácter Unicode “ñ” en la quinta posición.

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

Casos especiales

Las desviaciones de este esquema se producen cuando el nombre de dominio contiene solamente caracteres no ASCII o no contiene ninguno.

Un nombre de dominio que solo contiene caracteres no básicos va a mostrar tras el proceso de codificación el prefijo ACE junto a una cadena completamente codificada.

Así, por ejemplo, a un nombre de dominio como παράδειγμα (en griego, ejemplo) le corresponde la siguiente codificación:

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

ACE: xn–hxajbheg2az3al

Cuando, por el contrario, un nombre de dominio está formado únicamente por caracteres ASCII, no se utiliza el procedimiento punycode. Por lo tanto, tampoco se añade un prefijo ACE. La codificación no es necesaria en este caso porque los protocolos básicos de Internet comprenden sin problemas el nombre de dominio.

Si se considera el nombre de dominio totalmente cualificado o FQDN (del inglés Fully Qualified Domain Name), se codificará por separado cada una de sus categorías (dominio de nivel superior, dominio de segundo nivel, dominio de tercer nivel, etc.).

Un dominio como пример.бг (búlgaro para ejemplo.bg) podría codificarse como sigue:

IDN: пример.бг

ACE: xn–e1afmkfd.xn–90ae

La siguiente tabla muestra un resumen de las diferentes variantes del procedimiento Punycode.

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

En el RFC 3492 se describe de manera detallada el algoritmo subyacente a Punycode. El documento también proporciona una implementación del procedimiento de codificación en el lenguaje de programación C.

Para la codificación de nombres de dominio internacionalizados, los usuarios suelen utilizar Punycode converters libres.

Punycode en dominios con emojis

No solo los nombres de dominio internacionalizados, sino también los dominios con emojis pueden codificarse con Punycode. Como requisito, es necesario que el dominio de nivel superior permita su uso y que el emoticono que se quiera usar esté registrado en el estándar Unicode.

Consejo

A día de hoy, son los TLD que aparecen a continuació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 combinación de texto y emoticonos.

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

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

No obstante, hoy prácticamente ningún navegador estándar implementa este modelo de dominio. Si introduces un dominio con emoji en Firefox, Chrome, Safari, Edge u Opera, la barra de direcciones solo muestra la cadena ACE.

Punycode converters gratuitos

Son varias las páginas que ofrecen convertidores Punycode gratuitos para transferir los IDN en representaciones compatibles 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 Cyberneticos. Esta herramienta hace hincapié en su capacidad de codificación de caracteres no ASCII tan característicos de la lengua española como la “ñ”, las diéresis o las tildes, aunque también de caracteres poco habituales de otros idiomas.

Captura de pantalla del Conversor de Dominios de Cyberneticos
Junto a unas sencillas instrucciones, la web de Cyberneticos ofrece un Punycode converter que permite la codificación ACE.

Otro conversor destacable es el Punycode converter de Mathias Bynens basado en punycode.js. Al igual que la herramienta antes explicada, este convertidor se puede aplicar para la codificación de IDN en español, pero también en otras lenguas.

Punycode converter de Mathias Bynens basado en punycode.js
Mathias Bynens ofrece con Punycode domain name converter una herramienta de código abierto para convertir nombres de dominios internacionalizados.
Dominios web
Compra y registra tu dominio ideal
  • Domina el mercado con nuestra oferta 3x1 en dominios
  • Tu dominio protegido con SSL Wildcard gratis
  • 1 cuenta de correo electrónico por contrato

¿Constituye Punycode un riesgo para la seguridad?

Punycode supone un riesgo para la seguridad en lo que respecta a los ataques homográficos, un tipo de phishing en el que los delincuentes imitan la apariencia de diferentes caracteres para atraer a usuarios desprevenidos 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 corresponde con la web oficial de la empresa de tecnología de California Apple Inc., sino con una página web de phishing creada únicamente 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 diferenciar estos dos caracteres, los navegadores sí los interpretan como caracteres diferentes.

Además, el hecho de que ni siquiera los certificados pueden proporcionar seguridad se convierte en una gran desventaja para los usuarios. Para las campañas de phishing modernas, los delincuentes registran los certificados SSL válidos, que confieren a la web creada apariencia de seguridad y profesionalidad.

Para evitar este tipo de ataques, las versiones actuales de Chrome y Opera muestran la cadena ACE en lugar del dominio internacionalizado. Internet-Explorer y Microsoft Edge impiden completamente el acceso a este tipo de dominios. Firefox es el único navegador que no ofrece protección contra el phishing Punycode.

Ejemplo de un ataque homográfico
Ejemplo de un dominio homográfico: la dirección URL es visualmente la misma que la del sitio web oficial de Apple. Sin embargo, se ha usado el carácter Unicode U+0430, que se corresponde 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 impidiendo la traducción de Punycode a IDN de forma general. Para esta solución temporal solo hay que seguir dos pasos:

  • Acceder a la configuración del editor: escribe about:config en la barra de direcciones del navegador web para abrir el editor de configuración de Firefox.

  • Obligar a Punycode: busca la configuración network.IDN_show_punycode y cambia el valor de false a true.

Tras la configuración, Firefox mostrará los dominios internacionalizados en la barra de direcciones como cadenas ACE.

¿Le ha resultado útil este artículo?
Page top