Skip to main content Link Search Menu Expand Document (external link)

Hashing i Autentikacija Poruka

Ova skripta je dodatak na kolegiju te obrađuje osnove hash funkcija i autentikacije poruka. Cilj je dati uvid u principe jednosmjernog hashiranja, upoznati se s popularnim hash funkcijama (MD5, SHA-1, SHA-256, SHA-3), te naučiti kako koristiti HMAC (Hash-based Message Authentication Code) za provjeru integriteta i autentičnosti podataka. Osim toga, obrađuju se koncepti saltinga i key-stretchinga (PBKDF2, bcrypt, Argon2) koji dodatno osiguravaju hashirane podatke. U praktičnim primjerima bit će prikazane implementacije koristeći Python biblioteku pyca/cryptography.


1. Uvod i Teorijski Pregled

1.1 Jednosmjerno Hashiranje

Jednosmjerno hashiranje je proces pretvaranja ulaznih podataka u fiksnu duljinu (hash) na način da je gotovo nemoguće rekonstruirati originalne podatke iz hash vrijednosti. Ovo se koristi za provjeru integriteta podataka, pohranu lozinki i druge sigurnosne primjene.

1.2 Hash Funkcije

Primjeri hash funkcija:

  • MD5: Brza, ali danas se smatra nesigurnom zbog mogućnosti kolizija.
  • SHA-1: Bolja od MD5, no više nije preporučena za sigurnosne primjene.
  • SHA-256: Dio SHA-2 obitelji, široko korištena zbog visoke sigurnosti.
  • SHA-3: Najnovija obitelj hash funkcija, nudi alternativu SHA-2 s drugačijom strukturom.

1.3 HMAC (Hash-based Message Authentication Code)

HMAC kombinira hash funkciju s tajnim ključem kako bi se osigurala integriteta i autentičnost poruka. Samo strane koje posjeduju tajni ključ mogu generirati ispravan HMAC, čime se sprječava manipulacija podacima.

1.4 Salting i Key-Stretching

  • Salting: Dodavanje slučajnog niza (salt) originalnim podacima prije hashiranja kako bi se spriječili napadi unaprijed izračunatih hash vrijednosti (rainbow table attacks).
  • Key-Stretching: Tehnike poput PBKDF2, bcrypt i Argon2 usporavaju proces hashiranja, čime se otežavaju brute-force napadi.

1.5 Implementacija u Pythonu

Biblioteka pyca/cryptography omogućuje implementaciju hash funkcija, HMAC-a i derivaciju ključeva (npr. PBKDF2) u Pythonu. Za bcrypt i Argon2 potrebno je instalirati dodatne pakete.


2. Praktični Primjeri u Pythonu

2.1 Hash Funkcije

Primjer korištenja hash funkcija pomoću modula cryptography.hazmat.primitives.hashes:

from cryptography.hazmat.primitives import hashes

def hash_poruke(poruka, algorithm):
    digest = hashes.Hash(algorithm)
    digest.update(poruka)
    return digest.finalize().hex()

poruka = b"Ovo je primjer poruke"

# MD5
md5_hash = hash_poruke(poruka, hashes.MD5())
print("MD5:", md5_hash)

# SHA-1
sha1_hash = hash_poruke(poruka, hashes.SHA1())
print("SHA-1:", sha1_hash)

# SHA-256
sha256_hash = hash_poruke(poruka, hashes.SHA256())
print("SHA-256:", sha256_hash)

# SHA-3-256
sha3_hash = hash_poruke(poruka, hashes.SHA3_256())
print("SHA3-256:", sha3_hash)

2.2 Implementacija HMAC-a

Primjer generiranja HMAC-a koristeći cryptography.hazmat.primitives.hmac:

from cryptography.hazmat.primitives import hmac, hashes

tajni_kljuc = b"mojatajnakljuc"
poruka = b"Ovo je poruka za HMAC"

def generiraj_hmac(tajni_kljuc, poruka):
    h = hmac.HMAC(tajni_kljuc, hashes.SHA256())
    h.update(poruka)
    return h.finalize().hex()

hmac_hash = generiraj_hmac(tajni_kljuc, poruka)
print("HMAC (SHA-256):", hmac_hash)

2.3 Salting i Key-Stretching s PBKDF2

Primjer korištenja PBKDF2HMAC iz cryptography.hazmat.primitives.kdf.pbkdf2:

import os
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend

lozinka = b"mojalozinka"
salt = os.urandom(16)  # Generiramo slučajni salt
iteracije = 100000

kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,
    salt=salt,
    iterations=iteracije,
    backend=default_backend()
)

hashed_lozinka = kdf.derive(lozinka)
print("PBKDF2 hash lozinke:", hashed_lozinka.hex())

3. Zadaci za Samostalnu Vježbu

Hashiranje i Verifikacija Poruke:
    Napišite skriptu koja:
        Prima unos poruke od korisnika.
        Izračunava hash poruke koristeći SHA-256 i SHA3-256.
        Uspoređuje izračunate hash vrijednosti s unaprijed definiranim hashom (simulirajte provjeru integriteta poruke).

Implementacija HMAC-a s Komunikacijom Preko Socketa:
    Kreirajte dvije skripte:
        Skripta 1 (Pošiljatelj): Prima unos poruke od korisnika, generira HMAC pomoću tajnog ključa te šalje poruku i HMAC preko socketa.
        Skripta 2 (Primatelj): Prima poruku i HMAC, izračunava HMAC za primljenu poruku te provjerava podudarnost kako bi osigurao integritet poruke.
    Koristite Pythonov modul socket i pyca/cryptography za implementaciju.

Salting i Key-Stretching za Sigurno Pohranjivanje Lozinki:
    Implementirajte program koji:
        Prima lozinku od korisnika.
        Generira salt i koristi PBKDF2HMAC za derivaciju ključa.
        Spremite salt i hash lozinke u datoteku te implementirajte funkciju koja provjerava ispravnost unesene lozinke uspoređujući hash.