Come cancellare correttamente una chiave? grande contro piccolo digerire

0

Spesso dobbiamo eliminare (smettere) le chiavi di accesso al database spesso, ma è importante sapere quale chiave sta usando ciascun sistema per evitare di rimuovere una chiave in uso creando così indisponibilità. Vogliamo che ogni sistema riferisca quale chiave sta utilizzando senza esporre la chiave stessa, naturalmente.

Utilizziamo chiavi generate in modo casuale con 512 bit di dimensione e abbiamo in programma di cancellare quelle chiavi e rendere disponibili gli hash in un supporto meno sicuro.

Ecco il dilemma: dovremmo usare un grande o un piccolo digest?

La dimensione minima del digest dovrebbe essere di 32 bit. Abbiamo solo bisogno di confrontare una manciata di chiavi ogni volta, quindi è ok avere 1- (1 / (2 ^ 32)) di fiducia (che dà più del 99,9999%). Anche un'eventuale collisione ritarda un poco le operazioni di smantellamento delle chiavi in collisione, quindi è innocuo.

Ovviamente se l'hacker vede l'hash, può filtrare tutte le chiavi che non producono lo stesso hash, riducendo lo spazio di ricerca a 2 ^ (512-32) o 2 ^ 480, che consideriamo abbastanza sicuro.

Tuttavia alcuni colleghi hanno suggerito che un piccolo digest è suscettibile alle tabelle arcobaleno e ad altri attacchi, quindi dovremmo usare un digest completo di SHA-256 o SHA-512. Mi sembra strano, perché se la nostra chiave stessa è 512 bit, allora un hash SHA-512 non genererebbe alcuna collisione e l'utente malintenzionato dovrebbe solo trovare la chiave che produce lo stesso hash. Tutta questa elaborazione può essere eseguita offline, senza accesso al database per testare le chiavi. Quindi sembra più pericoloso dell'utilizzo di un digest a 32 bit.

Come possiamo risolvere questo?

    
posta fernacolo 02.05.2016 - 21:01
fonte

2 risposte

1

Nel tuo caso d'uso specifico, questa asserzione è errata:

... suggested that a small digest is susceptible to rainbow tables and other attacks ...

Una tabella arcobaleno è solo una tabella di ricerca dei valori digest precomputerizzati. Pensa al tuo uso di un hash come l'indice alla fine di un libro, che ti dice quale numero di pagina leggere per trovare il contesto reale contenente quella parola. Come un libro, lo stesso numero di pagina può indicizzare molte parole diverse: le chiamiamo collisioni. Con un algoritmo hash la dimensione della pagina non è limitata come una pagina di un libro, quindi è possibile un numero infinito di collisioni. In tal caso, conoscere il numero di pagina non ti dice quale delle infinite collisioni possibili è in realtà la tua chiave, quindi rivela poco all'attaccante.

Considerare il caso assurdo in cui si riduce la lunghezza del digest a soli due bit; con solo quattro valori possibili, vedrai che conoscere il valore digest di 0, 1, 2 o 3 non ti dice quale sia la chiave. Ecco perché un tavolo arcobaleno non aiuterà l'aggressore.

Il motivo per cui le tabelle arcobaleno sono utili per gli aggressori è che alcuni sistemi memorizzano solo valori di digest al posto delle password. (Il vecchio sistema LANMAN di Microsoft ha fatto questo errore memorizzando gli hash delle password di 7 caratteri.) In quei sistemi, conoscere qualsiasi password che genera l'hash desiderato consentirebbe all'utente malintenzionato di ricreare il valore hash e ottenere l'accesso. Ma nel tuo caso, conoscere il valore digerito non rivela quale delle collisioni è la vera chiave; semplicemente sapere che il valore digest non fornisce l'accesso all'attaccante.

Conoscere il valore digest fornisce all'aggressore la possibilità di ridurre il numero di chiavi con cui tenta di indovinare, ma con 2 ^ 512 tra cui scegliere, la riduzione delle possibilità 2 ^ 32 non riduce il suo spazio di ricerca a un intervallo di ipotesi plausibile, che in pratica sarebbe probabilmente inferiore a 2 ^ 80. In realtà, si ostacola di più l'attaccante fornendo una lunghezza di digest più breve, in quanto riduce la sua capacità di limitare il suo spazio di ricerca.

Dovresti scegliere una lunghezza del digest che ti fornisca un'alta probabilità di non confondere un digest chiave legittimo con un altro. È tutto ciò di cui ti devi preoccupare.

    
risposta data 02.05.2016 - 23:23
fonte
2

In pratica non importa letteralmente.

Se la tua dimensione della chiave è 512-bit (non sono sicuro di quale cifra stai usando, come nessuna che io sappia usare le chiavi a 512 bit, ma qualunque altra cosa) allora hai due scenari:

  • In un piccolo riassunto hai così tante collisioni che scoprendo la chiave originale cercando i valori corrispondenti ti daranno uno stupido numero di risultati. Per non parlare del tentativo di eseguire qualsiasi algoritmo computazionalmente remoto 2 512 volte, o anche 2 256 volte, è praticamente impossibile.
  • In un digest grande hai meno collisioni (un hash SHA-512 di tutti i valori nello spazio a 512 bit produrrà, con tutta probabilità, un numero di collisioni: è davvero molto difficile dimostrare ) ma una funzione hash molto più lenta. Di nuovo, con uno spazio di input di 2 512 o 2 256 è praticamente impossibile eseguire la forza bruta.

C'è un sacco di pensieri errati su entrambi i lati del tuo argomento, però:

  • La forzatura brutale di un singolo valore a 256 bit su un computer convenzionale richiederebbe più energia di quella che possiamo osservare nell'universo conosciuto a causa di Principio di Landauer . Più contesto su questo può essere trovato in un post sul blog di Bruce Schneier . Un valore di 512 bit è ancora più ridicolo - non accadrà proprio, anche se hai un'implementazione efficiente di Grover's algoritmo su un computer quantistico incredibilmente avanzato.
  • Le tabelle arcobaleno non sono utili su questi tipi di attacco. L'idea di una tabella arcobaleno è quella di enumerare tutti i possibili valori di input prima del tempo per una funzione di hash nota e memorizzare i plaintext e gli hash in una catena. Questo rende molto facile eseguire ricerche su un hash e ottenere il valore originale. Tuttavia, questo è possibile solo per spazi di input di dimensioni sensibilmente ridotte, ad es. Le password. Con uno spazio di input a 512 bit il numero di stati è così grande che la memorizzazione di un hash a 8 bit per ciascun valore di input richiederebbe 2 512 byte (ad es. 1.190853 × 10 139 petabyte) di archiviazione. Anche se potessi in qualche modo calcolare tutti quegli hash (di nuovo il principio di Landauer) avresti bisogno di memorizzarli da qualche parte. Anche se potessi memorizzare un intero byte, in qualche modo, su ciascun fotone dell'universo conosciuto, non avresti mai visto abbastanza vicino - solo circa 10 50 in effetti.

Tutto sommato, scegli un strong hash crittografico come SHA-256 e non preoccuparti.

    
risposta data 02.05.2016 - 21:27
fonte