Hash funkcije so eno izmed najpomembnejših orodij v sodobni računalniški znanosti. Na prvi pogled so nevidne - uporabljajo se za preverjanje integritete datotek, shranjevanje gesel, digitalne podpise in blockchain tehnologijo. Brez hash funkcij bi internet, kot ga poznamo danes, preprosto ne mogel delovati.
Kaj je hash funkcija?
Hash funkcija je matematična funkcija, ki vzame vhod poljubne dolžine (besedilo, datoteka, slika) in vrne izhod fiksne dolžine - tako imenovani "hash" ali "prstni odtis" (fingerprint). Ta izhod je vedno enako dolg, ne glede na to, ali je vhod en znak ali celoten film v visoki ločljivosti.
Najpomembnejše lastnosti hash funkcij:
- Determinističnost: Enak vhod vedno vrne enak izhod
- Hitrost: Izračun hash-a je hiter
- Avalančni učinek: Sprememba enega samega znaka v vhodu popolnoma spremeni izhod
- Enosmernost: Iz hash-a ni mogoče rekonstruirati originalnega vnosa
- Kolizijska odpornost: Dva različna vhoda ne bi smela dati istega hash-a
Primer avalančnega učinka
Najboljši način za razumevanje hash funkcij je konkreten primer. Poglejmo SHA-256, ki je ena najpogosteje uporabljenih hash funkcij:
SHA-256("hello world") = b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
SHA-256("Hello world") = 64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c
SHA-256("hello world!") = 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9
Razlika med "hello" in "Hello" je samo ena velika črka, vendar je rezultat popolnoma drugačen. To je avalančni učinek - minimalna sprememba na vhodu povzroči drastično spremembo na izhodu.
Najpogostejše hash funkcije
| Funkcija | Dolžina izhoda | Status | Tipična uporaba |
|---|---|---|---|
| MD5 | 128 bitov | Nezanesljiv (kolizije najdene) | Preverjanje datotek (nezahtevno) |
| SHA-1 | 160 bitov | Zastarel | Zgodovinski Git |
| SHA-256 | 256 bitov | Varen, priporočen | Gesla, digitalni podpisi, blockchain |
| SHA-512 | 512 bitov | Varen, priporočen | Varnostne aplikacije visoke ravni |
| bcrypt | Spremenljivo | Varen za gesla | Shranjevanje gesel |
| Argon2 | Spremenljivo | Najnovejši, najboljši za gesla | Moderni sistemi gesel |
Kje se uporabljajo hash funkcije?
Hash funkcije so povsod. Tukaj so najpomembnejši primeri uporabe:
- Shranjevanje gesel: Spletna mesta ne shranjujejo gesel v izvorni obliki. Shranijo le hash. Ko se uporabnik prijavi, se vhodno geslo hash-a in primerja s shranjenim hash-em
- Integriteta datotek: Pri prenosu velikih datotek (npr. ISO slike operacijskih sistemov) se objavi hash, da lahko prejemnik preveri, ali je datoteka nepoškodovana
- Digitalni podpisi: Pri podpisovanju dokumentov se ne podpiše celotna datoteka, ampak samo njen hash
- Blockchain: Vsak blok v blockchain-u vsebuje hash prejšnjega bloka, kar ustvarja verigo, ki je ni mogoče spreminjati
- Git: Vsak commit v Git-u ima svoj hash, ki unikatno identificira stanje kode
- HTML in CSS: Cache busting - dodajanje hash-a v ime datoteke (npr. style.a3f9b2.css) za prisilno osvežitev predpomnilnika
Hash gesla v praksi
Najpogostejša uporaba hash funkcij, na katero boste naleteli, je shranjevanje gesel. Evo kako deluje v praksi:
// Registracija uporabnika:
1. Uporabnik vnese geslo: "mojeTajnoGeslo123"
2. Strežnik izračuna hash:
bcrypt("mojeTajnoGeslo123") → $2b$12$N9qo8uLOickgx2ZMRZoMy...
3. V bazi se shrani samo hash, nikoli plain text geslo
// Prijava uporabnika:
1. Uporabnik vnese geslo: "mojeTajnoGeslo123"
2. Strežnik izračuna hash iz vnosa
3. Strežnik primerja hash z shranjenim hash-em
4. Če se ujemata → prijava uspešna
5. Če se ne ujemata → napaka
Zakaj je to pomembno? Če nekdo vdre v bazo podatkov, ne dobi gesel - dobi samo hash-e. In ker so hash funkcije enosmerne, iz hash-a ni mogoče dobiti originalnega gesla.
Soljenje gesel (Salting)
Navaden hash ni dovolj za varno shranjevanje gesel. Zakaj? Ker bi lahko napadalec uporabil "mavrico" (rainbow table) - vnaprej izračunano tabelo hash-ev za pogosta gesla. Rešitev je solenje (salting) - dodajanje naključnega niza znakov k geslu pred hash-anjem:
// Brez soli - ranljivo:
SHA-256("geslo123") → vedno enak rezultat za vse uporabnike z istim geslom
// S soljo - varno:
SHA-256("geslo123" + "x7K9mP2q") → unikatni hash za tega uporabnika
SHA-256("geslo123" + "b3R8nL5w") → drugačen hash za drugega uporabnika
// Tudi če imata dva uporabnika enako geslo,
// sta njuna hash-a popolnoma različna
Hash ni enkripcija!
To je zelo pogosta zabloda, ki jo je treba razjasniti. Hash in enkripcija sta dve različni stvari:
| Lastnost | Hash | Enkripcija |
|---|---|---|
| Smer | Enosmeren (ni povratka) | Dvosmeren (možnost dešifriranja) |
| Namen | Preverjanje integritete | Skritje vsebine |
| Ključ | Brez ključa | Zahteva ključ (simetrični ali asimetrični) |
| Primer | SHA-256, bcrypt | AES, RSA |
| Vrnitev originala | Ni mogoča | Možna s pravim ključem |
Preprosto rečeno: hash je kot mlin za meso - ko enkrat spelete meso skozi, ga ne morete več dobiti nazaj v originalni obliki. Enkripcija pa je kot sef - z pravim ključem lahko odprete in dobite originalno vsebino.
Zakaj je to pomembno?
Hash funkcije so temelj digitalne varnosti. Vsakič, ko se prijavite v spletno mesto, prenesete datoteko, podpišete digitalni dokument ali opravite transakcijo s kriptovaluto - hash funkcije delujejo v ozadju in zagotavljajo, da so podatki pristni in nespremenjeni.
Razumevanje hash funkcij je prvi korak k razumevanju širših varnostnih konceptov, kot so enkripcija, digitalni podpisi in avtentikacija. V naslednjem članku bomo podrobneje obravnavali enkripcijo in kako se razlikuje od hash-anja. Za boljše razumevanje hash-anja gesel si lahko ogledate praktičen primer v moji vadnici: PHP obrazci z varno zaščito gesel.