Vorrei cercare un altro modo per salvare le credenziali, utilizzate per verificare l'accesso dell'utente al mio database.
Mi è venuta in mente questa idea. Dal momento che ritengo che anche conoscendo un testo in chiaro e un corrispondente testo cifrato derivato con il codice AES-256 non debba portare alla rivelazione della chiave, quando la chiave è sufficientemente lunga e abbastanza casuale, posso prendere la password come chiave di crittografia qui ?
Consideriamo un esempio, supponiamo che l'utente 'test' dovrebbe usare 'apple' come sua password. Nella registrazione, il programma funziona in questo modo:
- Scegli una stringa casuale di 32 byte. Denotato da
R
; - Costruisci il testo in chiaro
P
, diP = Whirlpool(R:'test':'apple')
; QuiWhirlpool
è l'algoritmo di hash con lo stesso nome. - Vorrei rendere la chiave più lunga, quindi dedurre
K
come chiave utilizzata per AES-256:K=Whirlpool('apple')
; - Encrypt
P
di AES-256, quindi ottieni il testo cifratoE=AES256Encrypt(K, P)
; - Quindi unisciti insieme a
R
eE
, otteniamo la credenzialeAUTH
che dovrebbe essere salvata nel database:AUTH=R:E
.
E quando ne avremo in seguito uno che inserisce il nome utente e la password, potremmo verificare ciò facendo:
- Cerca il nome utente e recupera
AUTH
; - Separa questo
AUTH
e abbiamo ottenutoR
eE
; - Utilizza il nome utente e la password forniti, potremmo calcolare
P'
, che è basato suR
dal database, il nome utente e la password dall'input. - E potremo derivare
K'
, un hash nell'algoritmo Whirlpool con questa password come input. - Quindi utilizziamo
K'
per provare a decrittografareE
, e quando decodificato con successo, confronta il decrittografato conP'
.
In breve: posso usare la mia password come chiave in AES-256 e confrontando un testo in chiaro noto e il risultato della decrittografia del testo cifrato memorizzato, per verificare gli utenti e per evitare perdite di password degli utenti dopo che il database è in qualche modo trapelato ?
A mio modo di vedere, solo conoscere il nome utente (con poche parole qui) e il AUTH
dovrebbe solo far trapelare i suggerimenti su come costruire una chiave di decrittografia possibile. L'attaccante è in grado di conoscere sia un testo in chiaro piuttosto randomizzato (e che non ha scelta di personalizzare) sia un testo cifrato fisso. E se qui è AES-256, non ci dovrebbe essere alcuna possibilità di rivelare la chiave (che non è la vera password) basandosi solo su questi due fattori.
E anche la casualità di questo testo in chiaro (derivato da una congiunzione di R
, nome utente, password) non è importante. Ma sembra che la casualità della chiave possa dirlo.
L'ultimo aspetto della considerazione potrebbe essere la velocità. Per me, la velocità non è un vero problema, almeno ora. E sebbene il processo sopra descritto abbia utilizzato (sia in fase di registrazione che in fase di verifica) 2 tempi di hashing e una volta di AES, potremmo comunque ridurre il Whirlpool a una sola volta. Quando paragono questo con l'HMAC con l'idromassaggio (due volte Whirlpool è usato qui), vedo qui è solo una volta di Whirlpool e una volta di AES. Se AES dovesse essere più veloce di un algoritmo hash come Whirlpool, penso che ci possa essere un vantaggio. Ma apprezzerei chiunque parlasse di questo aspetto.