Hajautusfunktiot ovat kaikkialla ohjelmistokehityksessä, vaikket sitä huomaisikaan. Aina kun lataat tiedoston ja tarkistat sen tarkistussumman, kirjaudut verkkosivulle, teet Git-commitin tai louhit Bitcoinia (okei, ehkä et sitä viimeistä), hajautusfunktiot tekevät raskaan työn kulissien takana.
Ymmärretään mitä ne ovat, miten ne eroavat ja milloin käyttää mitäkin.
Mikä on hajautusfunktio?
Hajautusfunktio ottaa minkä tahansa syötteen — yksittäisen merkin, romaanin, 4 Gt:n videotiedoston — ja tuottaa kiinteän kokoisen tulosteen nimeltä "tiiviste" tai "hash". Ajattele sitä datan sormenjälkenä. Riippumatta siitä kuinka suuri tai pieni syöte on, tuloste on aina saman pituinen.
Tässä on mikä tekee hajautusfunktioista erityisiä:
- Deterministinen: Sama syöte antaa aina saman tulosteen.
hash("hello")palauttaa saman arvon joka ikinen kerta, millä tahansa koneella, millä tahansa ohjelmointikielellä. - Yksisuuntainen: Syötettä ei voi selvittää tulosteesta. Tiivisteen perusteella ei ole mitään tapaa päätellä, mikä sen tuotti (paitsi arvaamalla). Tämä tekee niistä hyödyllisiä salasanojen tallentamiseen.
- Lumivyöryefekti: Muuta yhtä bittiä syötteessä, ja tuloste muuttuu dramaattisesti. Esimerkiksi SHA-256-tiivisteet sanoille "hello" ja "Hello" ovat täysin erilaisia merkkijonoja.
- Törmäyskestävyys: Kahden eri syötteen, jotka tuottavat saman tiivisteen, löytämisen pitäisi olla käytännössä mahdotonta. Mitä vahvempi algoritmi, sitä vaikeampia törmäyksiä on löytää.
Katsotaan se käytännössä:
Täysin erilaiset tulosteet syötteistä, jotka eroavat vain yhdellä merkillä — pieni "h" vastaan iso "H". Tämä on lumivyöryefekti toiminnassa.
Miten hajautusfunktiot toimivat konepellin alla
Vaikka hajautusfunktioiden takana oleva matematiikka on monimutkaista, yleinen prosessi on suoraviivainen. Useimmat hajautusfunktiot noudattavat näitä vaiheita:
1. Täyte (Padding): Syöteviesti täytetään niin, että sen pituudesta tulee kiinteän lohkokoon monikerta (esim. 512 bittiä SHA-256:lle). Tämä varmistaa, että algoritmi voi käsitellä datan yhtenäisinä lohkoina.
2. Lohkojako: Täytetty viesti jaetaan kiinteän kokoisiin lohkoihin.
3. Pakkauskerrokset: Jokainen lohko käsitellään useiden bittitason operaatiokerrosten läpi — XOR, AND, OR, bittisiirrot ja modulaarinen yhteenlasku. Nämä operaatiot sekoittavat bitit perusteellisesti niin, että jokainen tulosteen bitti riippuu jokaisesta syötteen bitistä.
4. Ketjutus: Yhden lohkon käsittelyn tuloste syötetään seuraavan lohkon käsittelyyn. Tämän vuoksi pienikin muutos syötteen alussa vyöryy jokaisen seuraavan lohkon läpi.
5. Lopullinen tiiviste: Kun kaikki lohkot on käsitelty, sisäinen tila tulostetaan lopullisena tiivistearvona.
Ydinhavainto on, että nämä operaatiot on helppo laskea eteenpäin mutta käytännössä mahdotonta kääntää. Bittejä ei voi "sekoittaa takaisin" alkuperäisen syötteen palauttamiseksi.
MD5: Eläköitynyt veteraani
Ronald Rivest suunnitteli MD5:n vuonna 1991, ja se tuottaa 128-bittisen tiivisteen (32 heksamerkkiä). Se oli vuosikymmenten ajan suosituin vaihtoehto — MD5-tarkistussummia näki jokaisen tiedostolatauksen vieressä internetissä.
MD5 katsotaan kuitenkin nykyään kryptografisesti murretuksi. Tutkijat ovat osoittaneet käytännön törmäyshyökkäyksiä — eli he voivat luoda kaksi eri tiedostoa, jotka tuottavat saman MD5-tiivisteen. Vuonna 2008 tutkijat käyttivät MD5-törmäystä väärennetyn SSL-sertifikaatin luomiseen, todistain ettei kyseessä ollut pelkästään teoreettinen heikkous.
Vielä hyväksyttävä: tiedostojen eheyden tarkistukset (latauksen onnistumisen varmistaminen), tarkistussummat deduplikointiin, ei-turvallisuuteen liittyvät hajautustaulut ja nopea datan sormenjälkitunnistus kun turvallisuus ei ole huolenaihe.
Älä koskaan käytä: salasanojen tallennukseen, digitaalisiin allekirjoituksiin, turvasertifikaatteihin tai mihinkään missä joku voisi tarkoituksella luoda törmäyksiä.
SHA-1: Myös eläkkeellä
NSA suunnitteli SHA-1:n ja se julkaistiin vuonna 1995. Se tuottaa 160-bittisen tiivisteen (40 heksamerkkiä). Vuosien ajan se oli standardi SSL-sertifikaateissa, PGP-allekirjoituksissa ja versionhallintajärjestelmissä.
Se vanheni sen jälkeen kun Google osoitti käytännön törmäyshyökkäyksen vuonna 2017 (kuuluisa SHAttered-hyökkäys). He loivat kaksi eri PDF-tiedostoa samalla SHA-1-tiivisteellä. Hyökkäys vaati 9 223 372 036 854 775 808 SHA-1-laskentaa — valtava määrä, mutta toteutettavissa nykyaikaisilla pilvilaskentaresursseilla.
Git käyttää yhä SHA-1:tä sisäisesti commit-tiivisteisiin, mutta siirtyy SHA-256:een. Selaimet ja sertifikaattiviranomaiset lopettivat SHA-1-sertifikaattien hyväksymisen vuosia sitten. Jos näet SHA-1:n käytössä turvallisuustarkoituksiin missään koodissa tänään, se tulisi merkitä ja siirtää pois.
SHA-256 ja SHA-512: Nykyiset standardit
Nämä kuuluvat SHA-2-perheeseen, jonka NSA suunnitteli ja joka julkaistiin vuonna 2001. Näitä sinun tulisi käyttää tänään useimpiin tarkoituksiin.
- SHA-256: 256-bittinen tuloste (64 heksamerkkiä). Käytetään Bitcoinissa, TLS-sertifikaateissa ja useimmissa turvasovelluksissa. Se on täydellinen tasapaino turvallisuuden ja suorituskyvyn välillä. Bitcoinin koko proof-of-work-järjestelmä perustuu kaksinkertaiseen SHA-256-hajautukseen.
- SHA-512: 512-bittinen tuloste (128 heksamerkkiä). Suurempi tuloste tarkoittaa enemmän törmäyskestävyyttä. Mielenkiintoista kyllä, SHA-512 on usein nopeampi kuin SHA-256 64-bittisillä prosessoreilla, koska se toimii natiivisti 64-bittisillä sanoilla, kun taas SHA-256 käyttää 32-bittisiä sanoja.
- SHA-384 ja SHA-512/256: Nämä ovat SHA-512:n katkaistuvia variantteja. SHA-384 antaa 384-bittisen tulosteen, kun taas SHA-512/256 antaa 256-bittisen tulosteen mutta SHA-512:n 64-bittisten operaatioiden suorituskykyhyödyillä.
Pikavertailu:
SHA-3: Seuraava sukupolvi
SHA-3 standardoitiin vuonna 2015 NIST:n järjestämän julkisen kilpailun jälkeen. Toisin kuin SHA-2, joka käyttää Merkle-Damgard-rakennetta, SHA-3 perustuu Keccak-sienirakenteeseen — perustavanlaatuisesti erilaiseen suunnitteluun.
Miksi tällä on merkitystä? Jos matemaattinen läpimurto koskaan vaarantaa SHA-2:n suunnittelutavan, SHA-3 ei olisi vaikuttunut koska se toimii täysin eri tavalla. Se on vakuutus kryptografiselle yhteisölle.
SHA-3 tulee samoissa tulosteko'oissa — SHA3-256, SHA3-384, SHA3-512 — ja esittelee myös SHAKE128:n ja SHAKE256:n, jotka ovat "laajennettavan tulosteen funktioita" ja voivat tuottaa minkä tahansa halutun pituisen tiivisteen.
Käytännössä SHA-2 on yhä laajemmin käytetty ja nopeampi useimmalla laitteistolla. SHA-3:n käyttöönotto kasvaa, mutta se on enemmän varastandardi kuin korvike.
Käytännön sovellukset
Git-versionhallinta: Jokainen commit, puu ja blob Gitissä tunnistetaan SHA-1-tiivisteellään. Kun suoritat git commit, Git tiivistää muutostesi sisällön, puurakenteen, ylemmän commitin tiivisteen, tekijätietosi ja aikaleiman. Siksi commit-tiivisteet näyttävät kuten a1b2c3d4e5f6... — ne ovat kirjaimellisesti SHA-1-tiivisteitä.
Bitcoin-louhinta: Louhijat kilpailevat löytääkseen nonce-arvon, joka yhdistettynä lohkon dataan ja kaksinkertaisesti SHA-256-tiivistettynä tuottaa tiivisteen, joka on alle kohdekynnyksen. Tämän tiivisteen löytämisen vaikeus on se, mikä turvaa koko verkon. Vuonna 2024 Bitcoin-verkko laskee noin 500 kvintiljoonaa SHA-256-tiivistettä sekunnissa.
Tiedostojen deduplikointi: Pilvipalvelut kuten Dropbox tiivistävät jokaisen lataamasi tiedoston. Jos tiiviste vastaa olemassa olevaa tiedostoa, ne eivät tallenna kopiota — ne vain lisäävät osoittimen. Tämä säästää valtavia määriä tallennustilaa.
Digitaaliset allekirjoitukset: Kun allekirjoitat dokumentin tai ohjelmistojulkaisun, et allekirjoita koko tiedostoa. Sen sijaan tiedosto tiivistetään ja tiiviste allekirjoitetaan yksityisellä avaimellasi. Vastaanottaja tiivistää tiedoston itse ja varmistaa allekirjoituksen kyseistä tiivistettä vasten.
API-todentaminen: HMAC (tiivisteperustainen viestintodentamiskoodi) yhdistää salaisen avaimen viesttiivisteeseen varmistaakseen sekä API-pyyntöjen eheyden että aitouden. AWS, Stripe ja useimmat suuret API:t käyttävät HMAC-SHA256:ta pyyntöjen allekirjoittamiseen.
Yleisiä virheitä joita kehittäjät tekevät tiivistämisen kanssa
Hajautusfunktioiden käyttö salasanoille: Pelkkä SHA-256 on liian nopea salasanojen tiivistämiseen. Hyökkääjä GPU:lla voi laskea miljardeja SHA-256-tiivisteitä sekunnissa, mikä tekee brute-force-hyökkäyksistä triviaaleja. Käytä aina tarkoitukseen rakennettuja salasanojen hajautusfunktioita kuten bcrypt, scrypt tai Argon2, jotka ovat tarkoituksella hitaita ja muisti-intensiivisiä.
Suolan käyttämättä jättäminen: Jos tiivistät salasanat ilman suolaa (satunnainen arvo joka lisätään jokaiseen salasanaan ennen tiivistämistä), identtiset salasanat tuottavat identtiset tiivisteet. Hyökkääjä esilasketulla "sateenkaaritaululla" voi etsiä yleiset salasanat välittömästi. Lisää aina uniikki, satunnainen suola per käyttäjä.
Tiivisteiden vertailu ajoitusturvattomasti: ==-operaattorin käyttö tiivisteiden vertailuun turvallisuuskriittisessä koodissa voi vuotaa tietoa ajoitussivukanavien kautta. Hyökkääjä voi mitata vertailun keston ja päätellä tiivisteen merkki kerrallaan. Käytä vakioaikaisia vertailufunktioita kuten crypto.timingSafeEqual() Node.js:ssä tai hmac.compare_digest() Pythonissa.
Tiivisteiden katkaiseminen: Jotkut kehittäjät katkaisevat tiivisteitä tilan säästämiseksi (esim. tallentavat vain ensimmäiset 16 merkkiä SHA-256-tiivisteestä). Tämä vähentää dramaattisesti törmäyskestävyyttä. Täydellä SHA-256-tiivisteellä on 2^256 mahdollista arvoa; katkaisu 16 heksamerkkiin jättää vain 2^64 — luvun jonka nykyaikainen laitteisto voi murtaa brute-forcella.
Mitä hajautusfunktiota käyttää?
- Tiedoston eheys (ei turvallisuutta): SHA-256 tai jopa MD5 riittää. Tarkistat vahingossa tapahtuneita vaurioita, et pahantahtoista manipulointia.
- Salasanojen tallennus: Ei mitään näistä! Käytä bcryptiä, scryptiä tai Argon2:ta — ne ovat tarkoituksella hitaita, mikä tekee brute-force-hyökkäyksistä epäkäytännöllisiä. Tavalliset hajautusfunktiot ovat liian nopeita salasanojen tiivistämiseen.
- Digitaaliset allekirjoitukset ja sertifikaatit: SHA-256 tai SHA-512.
- HMAC (viestintodentaminen): SHA-256 tai SHA-512.
- Git-tyylinen sisältöosoittaminen: SHA-256 (mihin Git on menossa).
- Tulevaisuudenvarmuus: Jos rakennat järjestelmää joka tarvitsee kestää vuosikymmeniä ja haluat varasuunnitelman siltä varalta että SHA-2 murretaan, harkitse SHA-3:a.
- Tarkistussummat dataputkissa: SHA-256 datan eheyden varmistamiseen putken vaiheiden välillä. CRC32 on nopeampi mutta havaitsee vain vahingossa tapahtuneet virheet, ei tarkoituksellista manipulointia.
Hajautusfunktiot koodissa: Käytännön esimerkkejä
Okei, tarpeeksi teoriaa — kirjoitetaan koodia. Koska rehellisesti sanottuna paras tapa ymmärtää hajautusta on yksinkertaisesti... tehdä sitä. Näin lasket tiivisteitä kielillä joita todennäköisesti käytät päivittäin.
Node.js — Sisäänrakennettu crypto-moduuli tekee tästä todella helppoa:
Ja parasta on — tiedoston tiivistäminen on melkein sama juttu:
Python — Pythonin hashlib on yhtä suoraviivainen. Minusta Pythonilla on kaunein API tähän:
Go — Go:n standardikirjasto on uskomattoman hyvin suunniteltu tähän:
Java — Hieman monisanaisempi (koska... Java), mutta toimii mainiosti:
Tiedostolatauksen vahvistaminen: Tämä on yksi käytännöllisimmistä hajautuksen käyttötavoista. Sanotaan että lataat Linux ISO:n ja verkkosivusto sanoo SHA-256-tarkistussumman olevan abc123.... Näin varmistat sen:
Tiedän että tämä vaikuttaa perusjutulta, mutta yllättyisit kuinka moni kehittäjä ohittaa tämän vaiheen. Yksi vioittunut tavu 4 Gt:n latauksessa voi pilata koko iltapäiväsi.
Sateenkaaritaulut ja miksi ne ovat pelottavia
Okei, tässä se osa joka räjäytti tajuntani kun opin siitä ensimmäistä kertaa. Kuvittele että joku esimaskee tiivisteen jokaiselle mahdolliselle salasanalle, vaikkapa 8 merkkiin asti. Jokainen yhdistelmä kirjaimia, numeroita ja symboleja. He tallentavat kaikki nuo tiiviste-salasana-yhdistelmät jättimäiseen hakutauluun.
Se on sateenkaaritaulu. Ja ne ovat täysin pelottavia.
Tässä syy: jos tallensit salasanat pelkkinä SHA-256-tiivisteinä (ilman suolaa), hyökkääjä joka saa tietokantasi ei tarvitse "murtaa" mitään. Hän vain etsii jokaisen tiivisteen sateenkaaritaulustaan. Bam — välitön salasanojen palautus. Haku kestää mikrosekunteja.
Kuinka suuria nämä taulut ovat? Sateenkaaritaulu joka kattaa kaikki aakkosnumeeriset salasanat 8 merkkiin asti voi olla noin 100-200 Gt. Kuulostaa paljolta, mutta se mahtuu yhdelle SSD:lle. Sivustot kuten CrackStation sisältävät tauluja miljardeilla esimasketuilla tiivisteillä ja murtavat yleisiä salasanatiivisteitä sekunneissa ilmaiseksi.
Ja nyt hyvät uutiset: suolaus voittaa sateenkaaritaulut täysin. Suola on vain satunnainen merkkijono jonka liität salasanaan ennen tiivistämistä:
Näitkö mitä tapahtui? Sama salasana ("password123") tuottaa täysin erilaisia tiivisteitä erilaisten suolojen takia. Hyökkääjän pitäisi rakentaa erillinen sateenkaaritaulu jokaiselle mahdolliselle suolalle, mikä on laskennallisesti mahdotonta.
Jokainen moderni salasanojen tiivistämiskirjasto (bcrypt, Argon2, scrypt) hoitaa suolauksen automaattisesti. Jos sinua koskaan houkuttaa kirjoittaa oma salasanojen tiivistäminen — älä. Tosissaan. Käytä bcryptiä ja jatka elämääsi.
HMAC: Tiivistäminen salaisuudella
HMAC tarkoittaa tiivisteperustaista viestintodentamiskoodia, ja tiedän, tiedän, se kuulostaa pelottavalta. Mutta pysy mukana — se on oikeasti aika yksinkertainen konsepti jonka olet todennäköisesti jo käyttänyt tietämättäsi.
Tavallinen tiivistäminen ottaa viestin ja tuottaa tiivisteen. HMAC ottaa viestin JA salaisen avaimen ja tuottaa tiivisteen. Olennainen ero on, että vain salaisen avaimen tunteva henkilö voi tuottaa tai vahvistaa HMAC:in. Se todistaa kaksi asiaa kerralla: viestiä ei ole muutettu, JA se tuli joltakulta joka tuntee salaisuuden.
Missä näet tämän käytännössä? Webhook-allekirjoituksissa. Kun GitHub tai Stripe lähettää webhookin palvelimellesi, ne sisällyttävät HMAC-SHA256-allekirjoituksen otsakkeisiin. Palvelimesi voi varmistaa, että webhook tuli todella GitHubilta (eikä sitä väärentänyt satunnainen hyökkääjä) laskemalla HMAC:in itse ja vertaamalla.
Tässä käytännön esimerkki GitHub-webhook-allekirjoituksen vahvistamisesta Node.js:ssä:
Huomasitko timingSafeEqual-kutsun? Se on ratkaisevaa. Tavallinen ===-vertailu palauttaa false heti kun löytää ensimmäisen eroavan merkin, mikä tarkoittaa että hyökkääjä voi mitata vasteajan ja päätellä allekirjoituksen tavu kerrallaan. Ajoitusturvallinen vertailu kestää aina saman ajan riippumatta siitä missä ero on.
Hajautusfunktioiden suorituskykymittaukset
Ymmärrän — suorituskyky merkitsee. Erityisesti jos tiivistät miljoonia tiedostoja build-putkessa tai käsittelet datatulvaa. Näin tärkeimmät hajautusfunktiot pärjäävät nopeudessa (karkeat vertailuarvot nykyaikaisella x86_64-laitteistolla):
Hetkinen, huomasitko tuon? BLAKE3 on 10 kertaa nopeampi kuin SHA-256 samalla kun se on kryptografisesti turvallinen. Se ei ole kirjoitusvirhe.
BLAKE3 on hajautusmaailman kuumin uutuus, ja hyvästä syystä. Se perustuu BLAKE2-perheeseen (joka jo päihitti SHA-3:n NIST-kilpailussa) mutta on suunniteltu uudelleen hyödyntämään SIMD-rinnakkaisuutta ja monisäikeistystä. Se voi tiivistää dataa käytännössä memcpy-nopeudella.
Miksi tällä on väliä? Build-työkalut välittävät. Paljon. Työkalut kuten Bazel, Buck ja erilaiset sisältöosoitteiset tallennusjärjestelmät viettävät hämmästyttävän paljon aikaa tiedostojen tiivistämiseen. Vaihto SHA-256:sta BLAKE3:een voi nopeuttaa riippuvuustarkistusta kertaluokalla. Rust-ekosysteemi on ottanut BLAKE3:n aggressiivisesti käyttöön, ja se ilmestyy yhä useampiin paikkoihin.
Kuitenkin SHA-256 ja SHA-512 ovat yhä oikea valinta kun tarvitset laajaa yhteensopivuutta tai standardien kuten FIPS noudattamista. Kaikki ei tue vielä BLAKE3:a, ja monissa käyttötapauksissa tiivistysnopeus ei ole muutenkaan pullonkaula.
Lohkoketju ja Merkle-puut: Tiivistäminen mittakaavassa
Okei, nyt tulee todella siistiä. Tiedätkö miten Git voi kertoa tarkalleen mikä tiedosto muuttui massiivisessa repositoriossa? Ja miten Bitcoin voi vahvistaa transaktion lataamatta koko lohkoketjua? Salaisuus on tietorakenne nimeltä Merkle-puu (nimetty Ralph Merklen mukaan, joka patentoi sen vuonna 1979).
Merkle-puu on periaatteessa puu tiivisteistä. Näin se toimii — kuvittele että sinulla on neljä datalohkoa:
Jokainen lehtisolmu on datalohkon tiiviste. Jokainen vanhempisolmu on lastensa ketjutettujen tiivisteiden tiiviste. Juuritiiviste (joskus "Merkle-juuri") on yksittäinen tiiviste joka edustaa KAIKKEA puun dataa.
Tässä aidosti tyylikäs osuus: jos yksikin bitti Data C:ssä muuttuu, Hash(C) muuttuu, mikä tarkoittaa että Hash(CD) muuttuu, mikä tarkoittaa että Root Hash muuttuu. Voit havaita peukaloinnin välittömästi tarkistamalla vain juuren.
Mutta paranee vielä. Sanotaan että haluat todistaa Data C:n kuuluvan puuhun paljastamatta Data A:ta, B:tä tai D:tä. Sinun tarvitsee antaa vain: Data C, Hash(D) ja Hash(AB). Vahvistaja voi rekonstruoida polun juureen ja tarkistaa täsmääkö se. Tätä kutsutaan "Merkle-todistukseksi", ja se on uskomattoman tehokas — miljoonan lehden puulle todistus on vain noin 20 tiivistettä pitkä (log2 miljoonasta).
Missä tätä käytetään käytännössä?
- Git: Koko repositoriosi on Merkle-puu. Commitit osoittavat puihin, puut osoittavat blobeihin, ja kaikki tunnistetaan SHA-1-tiivisteellään. Siksi Git voi välittömästi kertoa onko jokin muuttunut.
- Bitcoin: Jokainen lohko sisältää Merkle-juuren kaikista transaktioista. Kevyet asiakkaat (kuten mobiililompakot) voivat vahvistaa tietyn transaktion Merkle-todistuksella lataamatta koko lohkoa.
- IPFS: InterPlanetary File System pilkkoo tiedostot palasiksi, rakentaa Merkle DAG:n (suunnattu syklitön graafi) ja käyttää juuritiivistettä tiedoston sisältötunnisteena (CID).
- Certificate Transparency: Googlen Certificate Transparency -lokit käyttävät Merkle-puita, jotta kuka tahansa voi tehokkaasti varmistaa onko sertifikaatti kirjattu (vai ei).
Tulevaisuus: Kvantin jälkeiset hajautusfunktiot
Olet ehkä kuullut että kvanttitietokoneet murtavat kaiken salauksemme. Ja kyllä, se on osittain totta — RSA, ECC ja Diffie-Hellman ovat kaikki mennyttä kun suuret kvanttitietokoneet saapuvat. Shorin algoritmi voi tehokkaasti tekijöidä suuria lukuja ja laskea diskreettejä logaritmeja, joihin nuo järjestelmät nojaavat.
Mutta tässä yllättävän hyvä uutinen: hajautusfunktiot ovat itse asiassa melko turvassa kvanttitietokoneilta. Suurin kvanttituhka hajautusfunktioille on Groverin algoritmi, joka voi hakea järjestämättömästä avaruudesta neliöllisesti nopeammin. Käytännössä tämä tarkoittaa turvallisuusbittien puolittumista — SHA-256 putoaa 2^256:sta 2^128:n vahvuuteen kvanttihyökkäyksiä vastaan.
2^128 on yhä absoluuttisen valtava. Se on suunnilleen havaittavan maailmankaikkeuden atomien lukumäärä toiseen potenssiin. Kukaan ei murra sitä brute-forcella, kvanttitietokoneella tai ilman.
Joten vaikka NIST työskentelee aktiivisesti kvantin jälkeisten salausstandardien parissa (ja viimeisteli useita vuonna 2024), kiire koskee pääasiassa julkisen avaimen salausta ja allekirjoituksia — ei hajautusfunktioita. Jos käytät SHA-256:ta tänään, voit nukkua rauhassa tietäen ettei kvanttitietokoneet tee sitä hyödyttömäksi.
Jos olet kuitenkin todella vainoharhainen (ja kryptografiassa vainoharhaisuus on hyve), siirtyminen SHA-512:een tai SHA3-256:een antaa lisäturvamarginaalin. Jotkin kvantin jälkeiset allekirjoitusjärjestelmät kuten SPHINCS+ on rakennettu kokonaan hajautusfunktioiden päälle, mikä on mukava luottamuslause niiden kvantinkestävyydelle.
Tiivistetörmäykset: Syntymäpäivähyökkäys selitettynä
Puhutaan yhdestä tietojenkäsittelytieteen epäintuitiivisimmista asioista: syntymäpäivähyökkäyksestä. Se on nimetty syntymäpäiväparadoksin mukaan, ja se on syy miksi hajautusfunktioiden täytyy olla suurempia kuin intuitiivisesti olettaisit.
Syntymäpäiväparadoksi: huoneessa jossa on vain 23 ihmistä, on 50% todennäköisyys että kahdella heistä on sama syntymäpäivä. Ei tietty syntymäpäivä — vain mikä tahansa vastaava pari. 70 ihmisellä todennäköisyys hyppää 99,9%:iin. Useimmat arvaavat tarvittavan noin 183 ihmistä (puolet 365:stä), mutta todellinen luku on paljon pienempi koska etsimme MITÄ TAHANSA törmäystä, emme tiettyä.
Täsmälleen sama matematiikka pätee hajautusfunktioihin. Jos hajautusfunktio tuottaa N mahdollista tulostetta, sinun ei tarvitse laskea N tiivistettä löytääksesi törmäyksen — tarvitset vain suunnilleen N:n neliöjuuren.
256-bittiselle tiivisteelle kuten SHA-256 on 2^256 mahdollista tulostetta. Törmäyksen löytäminen vaatii noin 2^128 operaatiota (2^256:n neliöjuuri). Se on yhä mahdottoman suuri luku — mutta se on syy miksi emme voi käyttää vain 64-bittistä tiivistettä.
Juuri siksi MD5 (128-bittinen) romahti. Sen törmäyskestävyys oli alun perin vain 2^64, ja algoritmin rakenteelliset heikkoudet laskivat sitä entisestään. Tutkijat löysivät lopulta törmäyksiä sekunneissa tavallisella kannettavalla.
Käytännön johtopäätös? Käytä aina vähintään 256-bittistä hajautusfunktiota mihin tahansa turvallisuuteen liittyvään. SHA-256, SHA3-256 tai BLAKE3 ovat kaikki erinomaisia valintoja. Ja jos joku ehdottaa 64- tai 128-bittisen tiivisteen käyttöä turvallisuustarkoituksiin, nyt tiedät tarkalleen miksi se on kauhea idea.
Kokeile itse
Haluatko tietää datasi tiivisteen? Käytä MD5-hajautusgeneraattoria, SHA-256-hajautusgeneraattoria tai SHA-512-hajautusgeneraattoria. Liitä tekstiä ja katso kuinka pienetkin muutokset tuottavat täysin erilaisia tiivisteitä — se on paras tapa rakentaa intuitiota näiden algoritmien käyttäytymisestä.