Punycode on stan­dar­doi­tu koo­daus­me­ne­tel­mä, jonka avulla Unicode-merkit voidaan esittää ra­joi­te­tul­la ASCII-mer­kis­töl­lä. Tämä tar­koit­taa, että kan­sain­vä­lis­te­tyt verk­ko­tun­nuk­set (IDN) voivat sisältää myös muita kuin ASCII-merkkejä, kuten esi­mer­kik­si umlauteja.

Miten koo­daus­me­ne­tel­mä ke­hi­tet­tiin?

Vuonna 2003 Internet En­gi­nee­ring Task Force (IETF) stan­dar­doi Punycoden syntaksin kan­sain­vä­lis­tet­ty­jen verk­ko­tun­nus­ten koo­daa­mi­seen so­vel­luk­sis­sa (IDNA). IETF mää­rit­te­lee verk­ko­tun­nuk­sen IDN:ksi, jos se sisältää eri­kois­merk­ke­jä, kuten diak­riit­ti­siä merkkejä, kirjaimia tai merkkejä, joita ei löydy la­ti­na­lai­ses­ta aak­ko­ses­ta (esim. saksan kielen umlautit). Tällaisia merkkejä ei voida käsitellä pe­rus­pro­to­kol­lil­la, kuten Domain Name System (DNS). Tässä esi­mer­kis­sä käytämme sak­san­kie­lis­tä verk­ko­tun­nus­ta. Vaikka IDN-tunnusten käyt­töö­no­ton jälkeen müller-büromöbel (Müllerin toi­mis­to­ka­lus­teet) on sallittu .de-tason verk­ko­tun­nuk­ses­sa, sitä voidaan käsitellä vain koo­daa­mal­la muut kuin pe­rus­mer­kit, esi­mer­kik­si nimien sel­vit­tä­mi­sen yh­tey­des­sä. Lukuisat internet-pro­to­kol­lat pe­rus­tu­vat englan­tiin ja tukevat siksi vain ra­joi­tet­tua ASCII-merkistöä.

IDN-nimien ja van­hem­pien in­ter­nets­tan­dar­dien yh­teen­so­pi­vuu­den var­mis­ta­mi­sek­si IETF on mää­rit­tä­nyt me­ne­tel­män, jolla kan­sain­vä­lis­te­tyt verk­ko­tun­nuk­set koodataan käyt­tä­mäl­lä jo aiemmin sal­lit­tu­ja merkkejä. Tätä stan­dar­doi­tua koo­daus­me­net­te­lyä kutsutaan nimellä Punycode.

Huomio

Säh­kö­pos­tio­soit­tei­den osalta Punycodea käytetään vain kan­sain­vä­lis­te­tyis­sä säh­kö­pos­ti­tun­nuk­sis­sa. Jos pai­kal­li­nen osa (merkkiä @ edeltävä osa) sisältää muita kuin ASCII-merkkejä, se koodataan UTF-8-mer­kis­töön.

Miten Punycode-koodaus toimii?

Yleis­kat­saus Punycode-pro­ses­siin

IETF on mää­ri­tel­lyt Punycoden RFC 3492 -stan­dar­dis­sa yhtenä mah­dol­li­se­na so­vel­luk­se­na yleiselle koo­dausal­go­rit­mil­le, joka tunnetaan nimellä Boot­string. Boot­string-algoritmi mah­dol­lis­taa sel­lais­ten merk­ki­jo­no­jen koo­daa­mi­sen, jotka koostuvat mie­li­val­tai­sis­ta mer­kis­töis­tä, käyttäen ra­joi­tet­tua va­li­koi­maa ele­ment­te­jä. Koo­daus­me­net­te­lyn ke­hit­tä­mi­nen perustuu kuuteen pe­ri­aat­tee­seen. Punycode-koo­dauk­ses­sa näitä ele­ment­te­jä kutsutaan pe­rus­mer­keik­si, jotka koostuvat pienistä kir­jai­mis­ta, nu­me­rois­ta ja vä­li­vii­vas­ta (-). Koo­daus­me­ne­tel­män ke­hit­tä­mi­nen perustuu kuuteen pe­ri­aat­tee­seen.

  • Täy­del­li­syys: Jokainen tu­los­tus­merk­ki­jo­no voidaan liittää yk­sin­ker­tais­tet­tuun merk­ki­jo­noon boot-merk­ki­jo­non avulla.
  • Ai­nut­laa­tui­suus: Tu­los­tus­merk­ki­jo­non liit­tä­mi­nen vas­taa­vaan käyn­nis­tys­merk­ki­jo­no­koo­dauk­seen on ai­nut­laa­tuis­ta. Jo­kai­sel­le Punycode-merkille voidaan liittää täs­mäl­leen yksi ASCII-vastaava ja päin­vas­toin.
  • Kään­net­tä­vyys: Boot­string-koodaus voidaan kääntää milloin tahansa ilman tietojen menetystä.
  • Tehokkuus: Koodattu merk­ki­jo­no on – jos ollenkaan – vain mi­ni­maa­li­ses­ti pidempi kuin tu­los­tus­merk­ki­jo­no.
  • Yk­sin­ker­tai­suus: Boot­string käyttää yk­sin­ker­tai­sia koodaus- ja de­koo­dausal­go­rit­me­ja.
  • Luet­ta­vuus: Vain merkit, joita ei voida esittää koh­de­mer­kis­tös­sä, koodataan. Kaikki muut merkit pysyvät muut­tu­mat­to­mi­na.

Punycode mää­rit­te­lee Boot­strin­gin kan­sain­vä­lis­tet­ty­jä verk­ko­tun­nuk­sia koskevien vaa­ti­mus­ten mu­kai­ses­ti. Tämän pitäisi mah­dol­lis­taa Unicode-merkkien muun­ta­mi­nen aiemmin sal­lit­tu­jen pe­rus­merk­kien avulla.

Punycode-esimerkki

Seuraava esimerkki ha­vain­nol­lis­taa, miten koodaus toimii:

IDN: müller-büromöbel

IDN-verk­ko­tun­nus „müller-büromöbel“ sisältää merkit ü ja ö, joita ei ole aiemmin sal­li­tus­sa verk­ko­tun­nus­ten mer­kis­tös­sä. Tästä syystä ne on koo­dat­ta­va Punycode-muotoon yh­teen­so­pi­vuu­den var­mis­ta­mi­sek­si.

Vaihe 1: Nor­ma­li­soin­ti

En­sim­mäi­ses­sä vaiheessa koo­dauspro­ses­si mah­dol­lis­taa tu­los­tet­ta­van merk­ki­jo­non nor­ma­li­soin­nin. Kaikki isot kirjaimet korvataan vas­taa­vil­la pienillä kir­jai­mil­la.

Vaihe 2: Kaikkien muiden kuin pe­rus­merk­kien pois­ta­mi­nen

Toisessa vaiheessa kaikki muut kuin pe­rus­mer­kit pois­te­taan. Nämä lisätään sitten verk­ko­tun­nuk­seen koo­da­tus­sa muodossa ja erotetaan toi­sis­taan vä­li­vii­val­la.

Jos Internet-osoit­tei­den koo­daa­mi­seen käytetään Punycode-syntaksia, jo­kai­sel­le tu­los­merk­ki­jo­nol­le annetaan ACE-etuliite (lyhenne sanoista ASCII-com­pa­tible encoding):

ACE-etuliite: xn–

ACE-etuliite varmistaa, ettei vä­li­vii­vo­ja si­säl­tä­viä verk­ko­tun­nuk­sia tulkita vir­heel­li­ses­ti kan­sain­vä­li­sik­si verk­ko­tun­nuk­sik­si.

Tämän seu­rauk­se­na IDN-tunnus “ müller-büromöbel“ koodataan seu­raa­vas­ti:

ACE: xn–mller-brombel-rmb4fg

Punycode-me­net­te­lyn taustalla oleva algoritmi on vai­kut­ta­va. Se varmistaa, että muun­nok­ses­ta huo­li­mat­ta verk­ko­tun­nus­ten pituus ei ylitä 63 merkin enim­mäis­pi­tuut­ta.

Koo­dauspro­ses­sin aikana Unicode-merkkejä ei muunneta yksi yhteen ASCII-merkeiksi. Sen sijaan algoritmi määrittää merk­ki­jo­non perustuen pois­tet­tu­jen merkkien väliseen etäi­syy­teen ja merkkien si­jain­tiin tu­los­tus­merk­ki­jo­nos­sa.

Edellä esitetyn esimerkin tapaan merk­ki­jo­no rmb4fg tar­koit­taa, että merk­ki­jo­noon mller-brombel on lisättävä Unicode-merkit ü ja ö toiseen ja seit­se­män­teen kohtaan.

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

Säännön poik­keuk­set

Poik­kea­mia esiintyy, jos verk­ko­tun­nuk­ses­sa ei ole lainkaan muita kuin pe­rus­merk­ke­jä tai jos se sisältää pel­käs­tään muita kuin pe­rus­merk­ke­jä.

Vain muita kuin pe­rus­merk­ke­jä si­säl­tä­väs­sä verk­ko­tun­nuk­ses­sa näkyy koo­dauk­sen jälkeen vain koodattu merk­ki­jo­no ja ACE-etuliite. Verk­ko­tun­nus, kuten παράδειγμα (kreikaksi ”esimerkki”), vastaa seuraavaa koodausta:

IDN: esimerkki

ACE: xn–hxajbheg2az3al

Jos verk­ko­tun­nus sisältää vain pe­rus­merk­ke­jä, Punycode-koodausta ei käytetä. Näin ollen ACE-etu­lii­tet­tä ei lisätä. Koodausta ei tässä ta­pauk­ses­sa tarvita, koska In­ter­ne­tin pe­rus­pro­to­kol­lat pystyvät jo tul­kit­se­maan verk­ko­tun­nuk­sen.

Kun tar­kas­tel­laan täy­del­lis­tä verk­ko­tun­nus­ta (FQDN) ko­ko­nai­suu­te­na, jokainen osa (ylätason verk­ko­tun­nus, toisen tason verk­ko­tun­nus, kolmannen tason verk­ko­tun­nus jne.) koodataan erikseen. Verk­ko­tun­nuskuten пример.bg (bul­ga­riak­si ”example.bg”) voi­tai­siin koodata seu­raa­vas­ti

IDN: esimerkki.bg

ACE: xn–e1afmkfd.xn–90ae

Seu­raa­vas­sa tau­lu­kos­sa on yh­teen­ve­to Punycode-syntaksin eri muun­nok­sis­ta.

IDN Punycode ACE
Perus- ja muut merkit müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Vain ei-pe­rus­mer­kit Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Vain pe­rus­mer­kit example.org example.org Ei käyttöä
Huomio

Punycode-algoritmi kuvataan yk­si­tyis­koh­tai­ses­ti RFC 3492 -stan­dar­dis­sa. Lisäksi asia­kir­jas­sa esitetään koo­daus­me­net­te­lyn toteutus C-oh­jel­moin­ti­kie­lel­lä.

Käyttäjät tur­vau­tu­vat yleensä il­mai­sek­si saa­ta­vil­la oleviin Punycode-muun­ti­miin kan­sain­vä­lis­tet­ty­jen verk­ko­tun­nus­ten koo­daa­mi­sek­si.

Puny-koodaus emoji-verk­ko­tun­nuk­sis­sa

Punycoden avulla voidaan toteuttaa paitsi kan­sain­vä­lis­tet­ty­jä verk­ko­tun­nuk­sia myös emo­ji­verk­ko­tun­nuk­sia. Jotta tämä toimisi, ylätason verk­ko­tun­nuk­sen on kuitenkin sal­lit­ta­va emojien käyttö, ja halutun emojin on kuu­lut­ta­va Unicode-stan­dar­diin.

Vinkki

Tällä hetkellä emoji-verk­ko­tun­nuk­sia voi re­kis­te­röi­dä seu­raa­vil­la ali­verk­ko­tun­nuk­sil­la: .ws, .tk, .to, .ml, .ga, .cf, .gq ja .fm.

Emoji-verk­ko­tun­nuk­set kä­si­tel­lään tek­ni­ses­ti Punycode-muodossa, mutta teoriassa ne tulisi esittää käyt­tä­jäl­le tekstin ja hymiöiden yh­dis­tel­mä­nä.

Emoji-verk­ko­tun­nus: https://i❤.ws/

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

Tällä hetkellä käy­tän­nös­sä mikään ta­val­li­nen selain ei tue tätä omi­nai­suut­ta. Jos kirjoitat emoji-verk­ko­tun­nuk­sen Fi­re­foxiin, Chromeen, Safarille, Edgeen tai Operaan, osoi­te­ri­vil­lä näkyy vain ACE-merk­ki­jo­no.

Onko olemassa ilmaisia Punycode-muuntimia?

Verkosta löytyy useita ilmaisia Punycode-muuntimia, jotka muuntavat IDN-osoitteet ASCII-yh­teen­so­pi­vaan muotoon. Yksi esimerkki on Punycoder.

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

Muiden ylätason verk­ko­tun­nus­ten (TLD) IDN-osoit­tei­den muun­ta­mi­seen sopii hyvin Mathias Bynensin punycode.js-kirjas toon perustuva Punycode-muunnin.

Kuva: 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­tio­na­li­sed domains.

Ai­heut­taa­ko Punycode tur­val­li­suus­ris­kin?

Punycode muodostuu tur­val­li­suus­ris­kik­si ho­mogra­fi­sen phis­hin­gin yh­tey­des­sä – kyseessä ovat ky­ber­hyök­käyk­set, joissa ri­kol­li­set hyö­dyn­tä­vät eri merkkien sa­man­kal­tais­ta ulkonäköä hou­ku­tel­lak­seen hy­vä­us­koi­sia uhreja vää­ren­ne­tyil­le verk­ko­si­vus­toil­le. Bloggaaja Xudong Zheng ha­vain­nol­lis­taa, miltä phishing-hyökkäys näyttää, käyttäen esi­merk­ki­nä seuraavaa Punycode-verk­ko­tun­nus­ta: https://www.xn--80ak6aa92e.com/. Tämä ohjaa in­ter­ne­tin käyttäjät verk­ko­si­vus­tol­le, jolla on seuraava IDN: https://www.аррӏе.com/

Annettu URL-osoite ei ole ka­li­for­nia­lai­sen tek­no­lo­giay­ri­tyk­sen Apple Inc:n vi­ral­li­nen verk­ko­si­vus­to, vaan esit­te­ly­tar­koi­tuk­ses­sa luotu tie­to­jen­ka­las­te­lusi­vus­to.

ASCII-merkin a (Unicode U+0061) sijaan käytetään ky­ril­lis­tä а-merkkiä (U+0430) – näitä kahta merkkiä on vaikea erottaa toi­sis­taan paljaalla silmällä, mutta verk­ko­se­lai­met tul­kit­se­vat ne eri merkeiksi. Edes var­men­teet eivät pysty takaamaan in­ter­ne­tin käyt­tä­jien tur­val­li­suut­ta. Ny­ky­ai­kai­sis­sa tie­to­jen­ka­las­te­lu­kam­pan­jois­sa ri­kol­li­set luovat kel­vol­li­sia SSL-var­men­tei­ta, jotta heidän verk­ko­si­vus­ton­sa näyt­täi­si­vät aidoilta.

Chromen ja Operan nykyiset versiot estävät tällaiset tie­to­jen­ka­las­te­lu­hyök­käyk­set näyt­tä­mäl­lä ACE-merk­ki­jo­non kan­sain­vä­lis­te­tyn verk­ko­tun­nuk­sen sijaan, kun verk­ko­tun­nuk­ses­sa (IDN) on se­koi­tet­tu eri mer­kis­tö­jen merkkejä. Internet Explorer ja Microsoft Edge estävät pääsyn täl­lai­siin verk­ko­tun­nuk­siin. Firefox ei sen sijaan tarjoa min­kään­lais­ta suojaa Punycode-tie­to­jen­ka­las­te­lua vastaan.

Kuva: Example of a homographic attack
Example of a ho­mograp­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­hingly similar to the ASCII character a.

Näin Firefox-käyttäjät voivat suojautua. Phishing-si­vus­to­jen ai­heut­ta­man riskin vä­hen­tä­mi­sek­si Firefox-käyt­tä­jil­lä on tällä hetkellä käy­tet­tä­vis­sään vain vaih­toeh­to, jolla estetään Punycoden muun­ta­mi­nen IDN-osoit­teik­si yleisesti. Tämä vä­liai­kai­nen ratkaisu vaatii vain kaksi vaihetta:

  1. Avaa asetusten muok­kaus­oh­jel­ma: Kirjoita selaimen osoi­te­ri­vil­le about:config ava­tak­se­si Firefoxin asetusten muok­kaus­oh­jel­man.
  2. Pakota Punycode: Etsi asetus network.IDN_show_punycode ja muuta sen arvo false:sta true:ksi.

Asetusten mää­rit­tä­mi­sen jälkeen Firefox näyttää kan­sain­vä­lis­te­tyt verk­ko­tun­nuk­set osoi­te­ri­vil­lä ACE-merk­ki­jo­noi­na.

Siirry pää­va­lik­koon