# Secure Login CLI

Python CLI koji demonstrira obrambenu autentikaciju: bcrypt hashiranje lozinke, brojanje neuspješnih pokušaja, privremeni lockout i audit logiranje.

GitHub
Python bcrypt Authentication Defensive security

### Features

Defensive Auth

- CLI register/login menu flow
- bcrypt hash salted
- fail counter per user
- lockout 5 fail / 10 min
- audit log events

### Files

JSON storage

- `users.json` bcrypt hashes
- `attempts.json` fails + lock_until
- `auth.log` audit trail

## Kako koristiti (brzo)

Pokreni aplikaciju iz foldera projekta:

    python main.py
    # 1) Register -> kreira korisnika (bcrypt hash)
    # 2) Login    -> provjera lozinke + fail counter + lockout

## Writeup

### Teorijska pozadina

Autentikacijski sustavi su temeljna komponenta modernih aplikacija: provjeravaju identitet korisnika i štite račune od neovlaštenog pristupa. Budući da su login endpointi javno izloženi, često su meta brute-force i credential-guessing napada. Bez obrambenih kontrola napadač može ponavljati pokušaje dok ne pogodi vjerodajnice.

Sigurna autentikacija zato nije samo “provjeri lozinku”, nego i: ograničavanje zloupotrebe (rate/lockout) i vidljivost aktivnosti kroz logove.

CLI Demonstration: registracija, uspješna prijava te uzastopni failovi koji završavaju lockoutom.

### Pohrana lozinki

Spremanje lozinki u plaintextu je ozbiljan rizik: kompromitacija baze odmah otkriva sve vjerodajnice. Zato se koriste funkcije za hashiranje lozinki dizajnirane baš za tu svrhu.

U ovom projektu lozinke se spremaju kao bcrypt hash s automatski generiranim saltom. Time identične lozinke ne daju isti hash, a brute-force postaje znatno skuplji (sporije i teže za napadača).

Password Storage: `users.json` sadrži samo bcrypt hash — nema plaintext lozinki.

### Neuspješni pokušaji prevare

Ponavljani neuspješni pokušaji često su indikator brute-force aktivnosti. Povremena pogreška je normalna, ali veliki broj uzastopnih failova nad istim računom izgleda sumnjivo.

Projekt vodi brojač neuspješnih pokušaja po korisniku i drži ga odvojeno od autentikacijskih podataka. To je bitno jer želiš pratiti ponašanje (attempts) bez miješanja sa storageom lozinki (users).

### Strategija zaključavanja računa

Kako bi se ograničila učinkovitost napada pogađanjem lozinke, implementirana je jednostavna lockout politika:

- svaki neuspješan pokušaj povećava brojač
- nakon 5 uzastopnih failova račun se zaključava
- zaključavanje traje 10 minuta

Ovo dramatično usporava brute-force i daje ti vrijeme za reakciju (logovi/monitoring), a i dalje je jednostavno za razumjeti i održavati.

Failed Attempts & Lockout State: `attempts.json` sprema broj failova i `lock_until` vrijeme.

### Revizijsko bilježenje

Bez logova je teško otkriti sumnjivo ponašanje ili istražiti incident. Zato se svi događaji autentikacije zapisuju u audit log.

Svaki zapis uključuje:

- timestamp
- tip događaja (registration/login)
- korisničko ime
- ishod (success/fail/locked)
- razlog neuspjeha kada postoji

### Dizajn pohrane podataka

JSON datoteke su korištene da implementacija ostane transparentna i edukativna. U produkciji bi se ovo spremalo u sigurnu bazu i dodatno zaštitilo (permissions, encryption at rest, rotation, monitoring).

### Zaključak

Projekt demonstrira temeljne obrambene mehanizme autentikacije: bcrypt pohranu lozinki, detekciju ponovljenih failova, privremeni lockout i audit logiranje. Dobar je temelj za nadogradnju (rate limiting, MFA, alerting, SIEM integracija).