Punycode

Bei Punycode handelt es sich um ein standardisiertes Kodierungsverfahren, das es ermöglicht, Unicode-Zeichen mithilfe eines limitierten ASCII-Zeichensatzes abzubilden, der lediglich aus folgenden Elementen besteht:

  • Kleinbuchstaben: a bis z
  • Ziffern: 0 bis 9
  • Sonderzeichen: Bindestrich (-)

Die aufgeführten Elemente werden als Basiszeichen bezeichnet.

Das Verfahren kommt in erster Linie bei der Verarbeitung internationalisierter Domainnamen (IDN) zum Einsatz, die zusätzlich zu den Basiszeichen auch Nicht-Basiszeichen enthalten.

Entwicklung des Kodierungsverfahrens

Punycode wurde im Jahr 2003 von der Internet Engineering Task Force (IETF) als Syntax zur Kodierung internationalisierter Domainnamen in Anwendungen (IDNA) standardisiert.

Als IDN bezeichnet die IETF Domainnamen, die über die Buchstaben des lateinischen Alphabets hinaus Sonderzeichen wie Umlaute, Diakritika oder Schriftzeichen anderer Alphabete beinhalten und daher von grundlegenden Protokollen wie dem Domain-Name-System (DNS) nicht verarbeitet werden können. Im deutschen Sprachraum spricht man auch von Umlautdomains.

Ein Domainname wie müller-büromöbel ist unter der Top-Level-Domain .de seit der Einführung von IDNs zwar zulässig, eine Verarbeitung – beispielsweise im Rahmen der Namensauflösung – ist aber nur durch Kodierung der Nicht-Basiszeichen möglich. Zahlreiche Protokolle, die dem Internet zugrundeliegen, orientieren sich an der englischen Schriftsprache und unterstützen daher nur den limitierten ASCII-Zeichensatz.

Um die Kompatibilität zwischen IDNs und älteren Internetstandards zu gewährleisten, hat die IETF die Kodierung internationalisierter Domainnamen mit den bisher zulässigen Zeichen vorgeschrieben und mit Punycode ein entsprechendes Verfahren standardisiert.

Hinweis

Bei E-Mail-Adressen kommt die Punycode-Kodierung lediglich bei internationalisierten E-Mail-Domains zum Einsatz. Der lokale Teil (vor dem @-Zeichen) hingegen wird via UTF-8 kodiert, sofern dieser Nicht-ASCII-Zeichen enthält.

Wie funktioniert die Kodierung via Punycode?

Punycode wird von der IETF in RFC 3492 als Anwendungsmöglichkeit eines als Bootstring bezeichneten allgemeinen Kodierungsalgorithmus definiert. Der Bootstring-Algorithmus erlaubt es, Zeichenfolgen beliebiger Zeichensätze mit einer limitierten Auswahl an Elementen eindeutig abzubilden. Der Entwicklung des Kodierungsverfahrens liegen sechs Prinzipien zugrunde:

  • Vollständigkeit: Jede Ausgangszeichenkette lässt sich per Bootstring auf eine vereinfachte Zeichenkette abbilden.
  • Eindeutigkeit: Die Zuordnung der Ausgangszeichenkette zur jeweiligen Bootstring-Kodierung ist eindeutig. Jedem Punycode kann genau ein ASCII-Pendant zugewiesen werden und umgekehrt.
  • Reversibilität: Die Kodierung per Bootstring lässt sich jederzeit ohne Informationsverlust rückgängig machen.
  • Effizienz: Die kodierte Zeichenkette ist – wenn überhaupt – nur minimal länger als die Ausgangszeichenkette.
  • Einfachheit: Bootstring greift auf einfache Kodierungs- und Dekodierungsalgorithmen zurück.
  • Lesbarkeit: Es werden nur die Zeichen codiert, die sich im Zielzeichensatz nicht darstellen lassen. Alle anderen Zeichen bleiben unverändert.

Punycode spezifiziert Bootstring gemäß der Ansprüche an internationalisierte Domainnamen. Das soll die Abbildung von Unicode-Zeichen über die bislang zulässigen Basiszeichen ermöglichen.

Wir veranschaulichen die Kodierung an folgendem Beispiel.

IDN: müller-büromöbel

Der IDN müller-büromöbel beinhalten mit ü und ö zwei Zeichen, die im bislang zulässigen Zeichensatz für Domainnamen nicht enthalten sind und daher zur Wahrung der Kompatibilität über Punycode kodiert werden müssen.

Das Kodierungsverfahren sieht im ersten Schritt eine Normalisierung der Ausgangszeichenkette vor. Alle Großbuchstaben werden durch entsprechende Kleinbuchstaben ersetzt. Ligaturen wie das ß werden in einzelne Zeichen aufgelöst (ss).

Im zweiten Schritt findet eine Tilgung aller Nicht-Basiszeichen statt. Diese werden anschließend in kodierter Form und durch einen Bindestrich abgetrennt an den Domainnamen angefügt.

Kommt das Punycode-Verfahren zur Kodierung von Internetadressen zum Einsatz, wird jeder Ergebnisstring mit einem sogenannten ACE-Präfix versehen (kurz für ASCII Compatible Encoding = ASCII-kompatible Kodierung):

ACE-Präfix: xn--

Das ACE-Präfix stellt sicher, dass Domainnamen, die Bindestriche enthalten, nicht fälschlicherweise als internationale Domainnamen interpretiert werden.

Für den IDN müller-büromöbel ergibt sich somit folgende Kodierung:

ACE: xn--mller-brombel-rmb4fg

Zu Abweichungen von diesem Schema kommt es, wenn der Domainname entweder gar keine oder nur Nicht-Basiszeichen enthält.

Ein Domainname der ausschließlich Nicht-Basiszeichen aufweist, zeigt nach der Kodierung lediglich die kodierte Zeichenfolge sowie das ACE-Präfix.

Eine Domainname wie παράδειγμα (griechisch für beispiel) entspricht somit folgender Kodierung:

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

ACE: xn--hxajbheg2az3al

Beinhaltet ein Domainname ausschließlich Basis-Zeichen, werden im Rahmen der Kodierung lediglich das ACE-Präfix sowie ein abschließender Bindestrich angefügt. Im Zusammenhang mit Domainnamen kommt das Punycode-Verfahren in diesem Fall nicht zur Anwendung.

Betrachtet man den Fully Qualified Domain Name (FQDN) insgesamt, wird jedes Label (Top-Level-Domain, Second-Level-Domain, Third-Level-Domain etc.) separat kodiert.

Eine Domain wie пример.бг (bulgarisch für beispiel.bg) ließe sich somit folgendermaßen kodieren

IDN: пример.бг

ACE: xn--e1afmkfd.xn--90ae

Folgende Tabelle gibt einen Überblick über die verschiedenen Varianten des Punycode-Verfahrens.

  IDN Punycode ACE  
Basis- & Nicht-Basiszeichen müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de  
Nur Nicht-Basiszeichen Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr  
Nur Basiszeichen example.org example.org- Keine Verwendung  

Bemerkenswert ist der dem Punycode-Verfahren zugrundeliegende Algorithmus, der sicherstellt, dass trotz der Konvertierung keines der Domain-Label die Maximallänge von 63 Zeichen überschreitet.

Im Rahmen der Kodierung werden Unicode-Zeichen nicht eins zu eins in ASCII-Zeichen übertragen. Stattdessen ermittelt der Algorithmus einen String, der sich aus dem Abstand der getilgten Zeichen zueinander sowie aus der Position der Zeichen im Ausgangstring ergibt.

Bezogen auf das oben dargestellte Beispiel gibt die Zeichenkette rmb4fg an, dass mller-brombel an zweiter und siebter Stelle um die Unicode-Zeichen ü und ö ergänzt werden muss.

Hinweis

Der dem Punycode zugrundeliegende Algorithmus wird in RFC 3492 detailliert beschrieben. Zudem bietet das Dokument eine Implementierung des Kodierungsverfahrens in der Programmiersprache C.

Anwender greifen bei der Kodierung internationalisierter Domainnamen in der Regel auf frei verfügbare Punycode-Converter zurück.

Kostenlose Punycode-Converter

Für den deutschen Namensraum mit der Top-Level-Domain .de empfehlen wir den IDN-Web-Converter der DENIC eG. Dieser konvertiert internationale Domainnamen gemäß aktueller IDNA-Standards (RFC 5890 bis 5894) und unterstützt Unicode 5.2 sowie den Unicode Technical Standard 46, der Inkompatibilitäten zwischen IDNA2003 und IDNA2008 minimiert.

Für IDNs anderer TLDs bietet sich der Punycode-Converter von Mathias Bynens auf Basis von punycode.js an.

Puny-Kodierung bei Emoji-Domins

Nicht nur internationalisierte Domainnamen auch Emoji-Domians lassen sich via Punycode realisieren. Voraussetzung dafür ist, dass die jeweilige Top-Level-Domain die Verwendung von Emojis erlaubt und das gewünschte Emoticon im Unicode-Standard erfasst wurde.

Tipp

Derzeit ermöglichen folgende TLDs eine Registrierung von Emoji-Domians: .ws, .tk, .to, .ml, .ga, .cf, .gq und .fm.

Emoji-Domains werden technisch als Punycode verarbeitet, sollen dem Anwender in der Theorie jedoch als Kombination aus Text und Emoticons präsentiert werden.

Emoji-Domain: i❤.ws/

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

Praktisch setzt dies derzeit kein Standardbrowser um. Gibt man eine Emoji-Domain bei Firefox, Chrome, Safari, Edge oder Opera ein, zeigt die Adresszeile lediglich den ACE-String.

Punycode als Sicherheitsrisiko?

Zum Sicherheitsrisiko wird Punycode im Zusammenhang mit homografischem Phishing Cyberangriffen, bei denen sich Kriminelle das ähnliche Aussehen verschiedener Schriftzeichen zunutze machen, um ihre ahnungslosen Opfer auf gefälschte Webseiten zu locken.

Wie ein solcher Phishing-Angriff aussehen kann, zeigt der Blogger Xudong Zheng am Beispiel folgender Punycode-Domain:

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

Diese führt Internetnutzer auf eine Website mit folgendem IDN:

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

Bei der angegebenen URL handelt es sich nicht um die offizielle Website des kalifornischen Technologieunternehmen Apple Inc., sondern um eine zu Demonstrationszwecken erstellte Phishing-Website.

Statt des ASCII-Zeichens a mit Unicode U+0061 kommt das kyrillische а (U+0430) zum Einsatz – diese zwei Zeichen sind mit bloßem Auge kaum zu unterscheiden, werden von Webbrowsern jedoch als unterschiedliche Zeichen interpretiert.

Besonders ungünstig für Internetnutzer: Auch Zertifikate geben keine Sicherheit. Denn für moderne Phishing-Kampagnen registrieren Kriminelle gültige SSL-Zertifikate, die entsprechenden Websites den Anschein von Rechtmäßigkeit geben sollen.

Aktuelle Versionen von Chrome und Opera unterbinden Phishing-Attacken dieser Art, indem sie bei IDNs, die Schriftzeichen verschiedener Zeichensätze mischen, statt der internationalisierten Domain den ACE-String anzeigen. Der Internet-Explorer Und Microsoft Edge unterbinden den Aufruf entsprechender Domains komplett. Lediglich Firefox biete bisher keinen Schutz gegen Punycode-Phishing.

So können sich Firefox-Nutzer schützen: Um die Gefahr durch Phishing-Websites zu reduzieren, bleibt Firefox-Nutzern derzeit nur die Möglichkeit, die Übersetzung von Punycode in IDNs generell zu unterbinden. Für diese temporäre Lösung sind lediglich zwei Schritte notwendig:

  1. Konfigurationseditor aufrufen: Geben Sie about:config in die Adresszeile des Webbrowsers ein, um den Firefox-Konfigurationseditor aufzurufen.
  2. Punycode erzwingen: Suchen Sie die Einstellung network.IDN_show_punycode und stellen Sie deren Wert von false auf true um.

Nach der Konfiguration stellt Firefox internationalisierte Domians in der Adresszeile künftig als ACE-String dar.