feat(auth): šifrovanje TOTP tajni u mirovanju (AES-256-GCM)

TOTP tajne se više ne čuvaju kao čist tekst u koloni korisnici.totp_tajna.
Uvedene auth.Sifruj/auth.Desifruj (AES-256-GCM) u internal/auth/kripto.go.
sqliteKorisniciRepo šifruje pri SacuvajTotpTajnu i dešifruje pri čitanju
(DohvatiPoImenu/PoID/Lista), pa ostatak programa i dalje vidi čistu tajnu.

Ključ je 32-bajtni NTECH_TOTP_KEY (base64), učitava se ili generiše pri
pokretanju (ucitajTotpKljuc) i upisuje u ntech.env van baze. Stare nešifrovane
tajne se tolerišu pri čitanju (fallback) i jednokratno šifruju pri startu
(ZasifrujPostojeceTotp). RequireAuth i Handler provode ključ do repo-a.

Dodati prvi testovi u repozitorijumu (internal/auth/kripto_test.go).
This commit is contained in:
2026-06-12 19:26:46 +02:00
parent daaa145545
commit ffb77ed122
6 changed files with 289 additions and 14 deletions
+4 -3
View File
@@ -16,10 +16,11 @@ type kontekstKljuc string
// KljucKorisnika je ključ za korisnika u request contextu
const KljucKorisnika kontekstKljuc = "korisnik"
// RequireAuth je chi middleware koji proverava sesiju i injektuje korisnika u context
func RequireAuth(db *sql.DB) func(http.Handler) http.Handler {
// RequireAuth je chi middleware koji proverava sesiju i injektuje korisnika u context.
// totpKljuc je ključ za dešifrovanje TOTP tajne (korisRepo ga koristi pri čitanju).
func RequireAuth(db *sql.DB, totpKljuc []byte) func(http.Handler) http.Handler {
sesijeRepo := sqlite.NoviSesijeRepo(db)
korisRepo := sqlite.NoviKorisniciRepo(db)
korisRepo := sqlite.NoviKorisniciRepo(db, totpKljuc)
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {