Punycode is een ge­stan­daar­di­seer­de co­de­rings­me­tho­de waarmee Unicode-tekens kunnen worden weer­ge­ge­ven met behulp van een beperkte ASCII-tekenset, wat betekent dat ge­ïn­ter­na­ti­o­na­li­seer­de do­mein­na­men (IDN’s) ook niet-ASCII-tekens kunnen bevatten, zoals bij­voor­beeld umlauten.

Hoe is de co­de­rings­me­tho­de ont­wik­keld?

In 2003 werd Punycode door de Internet En­gi­nee­ring Task Force (IETF) ge­stan­daar­di­seerd als syntaxis voor het coderen van ge­ïn­ter­na­ti­o­na­li­seer­de do­mein­na­men in toe­pas­sin­gen (IDNA). De IETF de­fi­ni­eert een do­mein­naam als een IDN als deze speciale tekens bevat, zoals dia­kri­ti­sche tekens, letters of tekens die niet in het Latijnse alfabet voorkomen (bij­voor­beeld umlauten in het Duits). Der­ge­lij­ke tekens kunnen niet worden verwerkt door ba­sis­pro­to­col­len zoals het Domain Name System (DNS). Voor dit voorbeeld gebruiken we een do­mein­naam in het Duits. Hoewel müller-büromöbel (Müllers kan­toor­meu­bi­lair) sinds de in­tro­duc­tie van IDN’s is toe­ge­staan onder het top­ni­veau­do­mein .de, kan het alleen worden verwerkt door de niet-bas­e­te­kens te coderen, bij­voor­beeld in de context van naam­re­so­lu­tie. Talrijke in­ter­net­pro­to­col­len zijn gebaseerd op het Engels en on­der­steu­nen daarom alleen de beperkte ASCII-tekenset.

Om com­pa­ti­bi­li­teit tussen IDN’s en oudere in­ter­net­stan­daar­den te ga­ran­de­ren, heeft de IETF een methode voor­ge­schre­ven voor het coderen van ge­ïn­ter­na­ti­o­na­li­seer­de do­mein­na­men met behulp van de tekens die al waren toe­ge­staan. Deze ge­stan­daar­di­seer­de co­de­rings­pro­ce­du­re staat bekend als Punycode.

Opmerking

Voor e-mail­adres­sen wordt Punycode alleen gebruikt voor ge­ïn­ter­na­ti­o­na­li­seer­de e-maildo­mei­nen. Als het lokale gedeelte (vóór het @-teken) niet-ASCII-tekens bevat, wordt het gecodeerd via UTF-8.

Hoe werkt Punycode-codering?

Een overzicht van het Punycode-proces

Punycode wordt door de IETF in RFC 3492 ge­de­fi­ni­eerd als een mogelijke toe­pas­sing van het algemene co­de­ringsal­go­rit­me dat bekend staat als Boot­string. Het Boot­string-algoritme maakt het mogelijk om te­ken­reek­sen die bestaan uit wil­le­keu­ri­ge tekensets met een beperkte selectie van elementen in kaart te brengen. De ont­wik­ke­ling van de co­de­rings­pro­ce­du­re is gebaseerd op zes principes. In Punycode-codering worden deze elementen ba­sis­te­kens genoemd, die bestaan uit kleine letters, cijfers en het kop­pel­te­ken (-). De ont­wik­ke­ling van de co­de­rings­me­tho­de is gebaseerd op zes principes.

  • Vol­le­dig­heid: Elke uit­voer­string kan worden toe­ge­we­zen aan een ver­een­vou­dig­de string met behulp van een boot­string.
  • Uniekheid: Het toewijzen van de uit­voer­string aan de res­pec­tie­ve Boot­string-codering is uniek. Elke Punycode kan precies één ASCII-te­gen­han­ger worden toe­ge­we­zen en vice versa.
  • Om­keer­baar­heid: Een Boot­string-codering kan op elk moment worden omgekeerd zonder verlies van in­for­ma­tie.
  • Ef­fi­ci­ën­tie: De ge­co­deer­de string is – indien al – slechts minimaal langer dan de out­putstring.
  • Eenvoud: Boot­string maakt gebruik van een­vou­di­ge coderings- en de­co­de­ringsal­go­rit­men.
  • Lees­baar­heid: Alleen tekens die niet in de doel­te­ken­set kunnen worden weer­ge­ge­ven, worden gecodeerd. Alle andere tekens blijven on­ge­wij­zigd.

Punycode spe­ci­fi­ceert Boot­string volgens de vereisten voor ge­ïn­ter­na­ti­o­na­li­seer­de do­mein­na­men. Hierdoor zouden de Unicode-tekens moeten kunnen worden toe­ge­we­zen via de eerder toe­ge­sta­ne ba­sis­te­kens.

Voorbeeld van Punycode

Het volgende voorbeeld laat zien hoe de codering werkt:

IDN: Müller-Büromöbel

De IDN müller-büromöbel bevat de tekens ü en ö, die niet zijn opgenomen in de eerder toe­ge­sta­ne tekenset voor do­mein­na­men. Daarom moeten ze worden gecodeerd via Punycode om com­pa­ti­bi­li­teit te ga­ran­de­ren.

Stap 1: Nor­ma­li­sa­tie

In de eerste stap zorgt de co­de­rings­pro­ce­du­re voor nor­ma­li­sa­tie van de uit­voer­te­kens­reeks. Alle hoofd­let­ters worden vervangen door de over­een­kom­sti­ge kleine letters.

Stap 2: Ver­wij­de­ring van alle niet-ba­sis­te­kens

In de tweede stap worden alle niet-ba­sis­te­ken ver­wij­derd. Deze worden ver­vol­gens in ge­co­deer­de vorm aan de do­mein­naam toe­ge­voegd en ge­schei­den door een kop­pel­te­ken.

Als de Punycode-syntaxis wordt gebruikt om in­ter­net­adres­sen te coderen, wordt elke re­sul­taatstring voorzien van een ACE-voor­voeg­sel (afkorting van ASCII-com­pa­ti­ble encoding):

ACE-voor­voeg­sel: xn–

Het voor­voeg­sel ACE zorgt ervoor dat do­mein­na­men met kop­pel­te­kens niet verkeerd worden ge­ïn­ter­pre­teerd als in­ter­na­ti­o­na­le do­mein­na­men.

Dit re­sul­teert in de volgende codering voor de IDN müller-büromöbel:

ACE: xn–mller-brombel-rmb4fg

Het algoritme dat ten grondslag ligt aan de Punycode-procedure is op­mer­ke­lijk. Het zorgt ervoor dat do­mein­na­men ondanks de conversie niet langer worden dan de maximale lengte van 63 tekens.

Tijdens het co­de­rings­pro­ces worden Unicode-tekens niet één op één omgezet in ASCII-tekens. In plaats daarvan bepaalt het algoritme een te­ken­reeks op basis van de afstand tussen de gewiste tekens en de positie van de tekens in de uit­voer­te­ken­reeks.

Met be­trek­king tot het bo­ven­staan­de voorbeeld geeft de te­ken­reeks rmb4fg aan dat mller-brombel moet worden aangevuld met de Unicode-tekens ü en ö op de tweede en zevende positie.

Afbeelding: Overview of sections of the ACE string
The ACE string consists of the ACE prefix and a puny-coded string.

Uit­zon­de­rin­gen op de regel

Er treden af­wij­kin­gen op als de do­mein­naam geen niet-bas­e­te­kens bevat of als deze alleen niet-bas­e­te­kens bevat.

Een do­mein­naam die alleen niet-bas­e­te­kens bevat, toont na codering alleen de ge­co­deer­de te­ken­reeks en het ACE-voor­voeg­sel. Een do­mein­naam zoals παράδειγμα (Grieks voor ‘voorbeeld’) komt overeen met de volgende codering:

IDN: voorbeeld

ACE: xn–hxajbheg2az3al

Als een do­mein­naam alleen ba­sis­te­kens bevat, wordt Punycode niet gebruikt. Er wordt dan ook geen ACE-voor­voeg­sel toe­ge­voegd. Codering is in dit geval niet nodig, omdat de do­mein­naam al door de ba­sis­in­ter­net­pro­to­col­len kan worden begrepen.

Als je de volledig ge­kwa­li­fi­ceer­de do­mein­naam (FQDN) als geheel beschouwt, wordt elk label (top­ni­veau­do­mein, twee­de­ni­veau­do­mein, der­de­ni­veau­do­mein, enz.) af­zon­der­lijk gecodeerd. Een domeinals пример.бг (Bulgaars voor ‘example.bg’) zou als volgt kunnen worden gecodeerd

IDN: пример.бг

ACE: xn–e1afmkfd.xn–90ae

De volgende tabel geeft een overzicht van de ver­schil­len­de varianten van de Punycode-syntaxis.

IDN Punycode ACE
Basis- en niet-ba­sis­ka­rak­ters müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Alleen niet-basis tekens Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Alleen bas­e­te­kens example.org example.org Geen gebruik
Opmerking

Het Punycode-algoritme wordt ge­de­tail­leerd be­schre­ven in RFC 3492. Daarnaast bevat het document een im­ple­men­ta­tie van de co­de­rings­pro­ce­du­re in de pro­gram­meer­taal C.

Ge­brui­kers maken meestal gebruik van vrij be­schik­ba­re Punycode-con­ver­ters voor het coderen van ge­ïn­ter­na­ti­o­na­li­seer­de do­mein­na­men.

Puny-codering met emoji-domeinen

Niet alleen ge­ïn­ter­na­ti­o­na­li­seer­de do­mein­na­men, maar ook emoji-domeinen kunnen via Punycode worden ge­re­a­li­seerd. Om dit te laten werken, moet het top­ni­veau­do­mein echter het gebruik van emoji’s toestaan en moet de gewenste emoticon in de Unicode-standaard staan.

Tip

Op dit moment kunnen emoji-domeinen worden ge­re­gi­streerd onder de volgende TLD’s: .ws, .tk, .to, .ml, .ga, .cf, .gq en .fm.

Emoji-domeinen worden technisch verwerkt als Punycode, maar zouden in theorie aan de gebruiker moeten worden ge­pre­sen­teerd als een com­bi­na­tie van tekst en emoticons.

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

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

Op dit moment im­ple­men­teert vrijwel geen enkele stan­daard­brow­ser dit. Als je een emoji-domein invoert in Firefox, Chrome, Safari, Edge of Opera, toont de adresbalk alleen de ACE-string.

Zijn er gratis Punycode-con­ver­ters?

Gratis Punycode-ge­ne­ra­to­ren die IDN’s omzetten naar een ASCII-com­pa­ti­be­le vorm zijn te vinden op ver­schil­len­de websites. Een voorbeeld hiervan is Punycoder.

Afbeelding: Punycoder, the Punycode converter
Punycoder converts Punycode to Text/Unicode and vice-versa.

Voor IDN’s van andere TLD’s is de Punycode-converter van Mathias Bynens, gebaseerd op punycode.js, een goede keuze.

Afbeelding: The Punycode converter made by Mathias Bynens based on punycode.js
With his *Punycode domain name converter,*Mathias Bynens offers an open-source tool for con­ver­ting in­ter­na­ti­o­na­li­sed domains.

Vormt Punycode een vei­lig­heids­ri­si­co?

Punycode vormt een vei­lig­heids­ri­si­co in het geval van ho­mo­gra­fi­sche phishing – cy­ber­aan­val­len waarbij cri­mi­ne­len ge­bruik­ma­ken van het ge­lijk­aar­di­ge uiterlijk van ver­schil­len­de tekens om niets­ver­moe­den­de slacht­of­fers naar valse websites te lokken. Blogger Xudong Zheng laat zien hoe een phis­hing­aan­val eruitziet aan de hand van het volgende Punycode-domein https://www.xn--80ak6aa92e.com/ als voorbeeld. Dit leidt in­ter­net­ge­brui­kers naar een website met de volgende IDN: https://www.аррӏе.com/

De opgegeven URL is niet de officiële website van het Ca­li­for­ni­sche tech­no­lo­gie­be­drijf Apple Inc., maar een phis­hing­web­si­te die voor de­mon­stra­tie­doel­ein­den is gemaakt.

In plaats van het ASCII-teken a met Unicode U+0061 wordt het Cy­ril­li­sche а (U+0430) gebruikt – deze twee tekens zijn met het blote oog nau­we­lijks te on­der­schei­den, maar worden door web­brow­sers als ver­schil­len­de tekens ge­ïn­ter­pre­teerd. Zelfs cer­ti­fi­ca­ten kunnen in­ter­net­ge­brui­kers geen vei­lig­heid bieden. Voor moderne phis­hing­cam­pag­nes maken cri­mi­ne­len geldige SSL-cer­ti­fi­ca­ten aan om hun websites au­then­tiek te laten lijken.

De huidige versies van Chrome en Opera voorkomen dit soort phis­hing­aan­val­len door de ACE-string weer te geven in plaats van het ge­ïn­ter­na­ti­o­na­li­seer­de domein op IDN’s die tekens uit ver­schil­len­de tekensets com­bi­ne­ren. Internet Explorer en Microsoft Edge voorkomen dat domeinen zoals deze worden geopend. Firefox biedt echter geen be­scher­ming tegen Punycode-phishing.

Afbeelding: Example of a homographic attack
Example of a ho­mo­grap­hic domain: The URL looks the same as Apple’s official website, however, the Unicode character U+0430 is actually a Cyrillic letter that is as­to­nis­hin­gly similar to the ASCII character a.

Zo kunnen Firefox-ge­brui­kers zichzelf be­scher­men. Om het risico van phis­hing­web­si­tes te ver­min­de­ren, hebben Firefox-ge­brui­kers momenteel alleen de mo­ge­lijk­heid om te voorkomen dat Punycode in het algemeen wordt vertaald naar IDN’s. Voor deze tij­de­lij­ke oplossing zijn slechts twee stappen nodig:

  1. Open de con­fi­gu­ra­tie-editor: typ about:config in de adresbalk van uw web­brow­ser om de Firefox-con­fi­gu­ra­tie-editor te openen.
  2. Forceer Punycode: Zoek de in­stel­ling network.IDN_show_punycode en wijzig de waarde van false in true.

Na con­fi­gu­ra­tie zal Firefox ge­ïn­ter­na­ti­o­na­li­seer­de domeinen in de adresbalk weergeven als ACE-strings.

Ga naar hoofdmenu