A Microsoft és XIII. Gergely pápa – avagy mit keres a GUID generátorban az 1582. október 4 dátum?

A GUID és az UUID

A GUID, a globálisan egyedi azonosító (Globally Unique Identifier) a microsoftos implentációja az UUID, az univerzálisan egyedi azonosító (Universally Unique Identifier) szabványára. Ez egy 16 byte hosszúságú álvéletlen szám (16 byte = 128 bit), ami 2128 variációt tesz lehetővé, ami nagyságrendileg 3.4 x 1038. Ez azért is nagy szám, mert pl. a látható univerzum átmérője 38.8 x 1026 méter, s így a fenti variációk száma tkp. egymilliárdszorosa annak, mint ahány milliméter az univerzum átmérője.

Azaz ha van sok dolgunk, s mindegyiknek akarunk adni egy egyedi azonosítót, akkor egyszerűen kap mindegyik egy ilyen álvéletlen számot. Mivel a variációk száma felfoghatatlanul nagyobb, mint a dolgok száma, így nem valószínű, hogy két dolog ugyanazt az azonosítót kapja. (Ami persze nem kizárható, de a valószínűsége gyakorlatilag 0.)

A szám generálása

A Microsoft egy 2005-ös dokumentuma szerint

4.1.4.  Timestamp
 
   The timestamp is a 60-bit value.  For UUID version 1, this is
   represented by Coordinated Universal Time (UTC) as a count of 100-
   nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of
   Gregorian reform to the Christian calendar).
 
   (...)
 
   For UUID version 3 or 5, the timestamp is a 60-bit value constructed
   from a name as described in Section 4.3.
 
   For UUID version 4, the timestamp is a randomly or pseudo-randomly
   generated 60-bit value, as described in Section 4.4.
 

Azaz az implementáció a 128 bites szám előállításához generál egy 60 bites időbélyegzőt, ami megmondja, hogy 1582 október 15. óta hányszor 100 nanoszekundum (a másodperc milliárdod része) telt el. Ez pedig annak a dátuma, amikor XIII. Gergely pápa bevezette a róla elnevezett Gergely naptárt.

Gergely pápa naptárreformja

Előzőleg a Juliánus naptárt használták, amit Julius Caesar vezetett be, ahol egy év 365 napból állt, s minden negyedik szökőévben egy szökőnapot iktatott be. Így egy év 365.25 napból áll (365 nap és 6 óra). Ugyanakkor egy év valójában 365 nap 5 óra 48 perc 46 másodpercből áll, így a különbség évente 11 perc 14 másodperc. Ennek pedig az volt a következménye, hogy amikor a szökőévben az évhez hozzátoldjuk a szökőnapot, akkor még pluszban hozzáadjuk ennek az eltérésnek a négyszeresét,  44 perc 56 másodpercet. Ez pedig 128 év alatt egy napot eredményezett, azaz 128 évente mindig egy további nappal előrébb ugrik ugyanaz a dátum. S ebből eredően XIII. Gergely korára már 10 nap volt az eltérés, így a pápa az Inter Gravissimas kezdetű bullájával rendelte el, hogy 1582 október 4.-ét október 15.-e kövesse, s a köztük lévő napok abban az évben kimaradtak a naptárból.

Azt pedig, hogy a továbbiakban a 128 évente előálló napok ne torlódjanak fel, azt Gergely pápa egy szellemes megoldással előzte meg. Mivel ez 400 évente jelentett kb. 3 napot, ezért a 400-zal nem osztható kerek évszázadok nem számítanak szökőévnek. Így pl. 1900 nem volt szökőév, 2000 viszont igen.

A timestamp a generált UUID számban

A uuidgenerator.net oldalon az 1. verziószámú UUID generátorral generálok egy számot. Ez egy 128 bites hexadecimális szám lesz: 6fe163202eb4-11ec-8d3d-0242ac130003. Ebből a 60 bites időbélyegző: 1ec2eb46fe16320 A szabványnak megfelelően először az időbélyegző alsó bitjei, majd a középső bitjei, s végül a felső bitjei következnek a számsor elején. Az utolsó, a felső bitek szakasza egy 1-sel kezdődik, ami nem tartozik az időbélyegzőhöz, hanem a generáló UUID program verzióját jelzi. Azaz ez az érték az első verzióval készült.

      UUID                   = time-low "-" time-mid "-"
                               time-high-and-version "-"
                               clock-seq-and-reserved
                               clock-seq-low "-" node
      time-low               = 4hexOctet
      time-mid               = 2hexOctet
      time-high-and-version  = 2hexOctet
      clock-seq-and-reserved = hexOctet
      clock-seq-low          = hexOctet
      node                   = 6hexOctet

A timeanddate.com oldal szerint a Gregorián naptár bevezetése óta a poszt írásának a dátumáig 160 344 nap telt el. A fenti hexadecimális számot átváltva decimális számrendszerbe a következő értéket kapjuk: 138537041047675680. A UUID értéke szerint ennyiszer 100 nanomásodperc telt el azóta. Ezt átszámítva napokká, azt kapjuk, hogy az 160 343,79 nap. A két érték sacc/kábé még stimmel is.

A hexadecimális kódban az utolsó egység, a node mező – egy 12 számjegyű hexadecimális szám – a kódot generáló számítógép hálózati kártyájának a Mac addresse. Ez esetünkben nem a blogger gépének, hanem a neten a számot generáló programot futtató szerver gépének a fizikai címe.

Biztonsági probléma

Az 1. verziószámú UUID programmal létrehozott véletlenszámból tehát ki lehet olvasni az azt létrehozó számítógép Mac address-ét, ami biztonsági probléma, hiszen a világon minden hálózati kártya egyedi Mac address-t használ. Így a mai UUID generátorok már nem használják fel a Mac address-t a véletlenszám létrehozásához.

Annak idején ez a biztonsági rés vezetett el a Melissa vírus írójához. A vírus volt az első jelentősebb vírus, amely emailekben terjedt. A fertőzött levél tárgya: “Important Message From …”, szövege pedig: “Here is that document you asked for … don’t show anyone else 😉“, a mellékelt dokumentum pedig pornóoldalak listáját tartalmazta. A megfertőzött gép ezután ugyanezt a levelet továbbküldte a felhasználó kapcsolati listáján szereplő első 50 címnek. A vírus 1999. március 26-án kezdett el terjedni, s akkora forgalmat generált, hogy több nagy cég – köztük a Microsoft – levelezési rendszere leállt. S a fenti biztonsági rés vezetett el a vírus írójához, ugyanis a víruskód tartalmazott egy GUID számot, amelyből így ki lehetett olvasni a vírust író személy gépének a Mac address-ét.