Hashing di una chiave: meno entropia della chiave stessa

5

Un'API web deve memorizzare una "chiave" per l'autenticazione, allo stesso modo di una password ma a 128 caratteri. La mia preoccupazione è che l'hash SHA1 salato della chiave abbia meno entropia della stessa chiave (40 caratteri contro 128 caratteri).

Comprendo che l'hash è necessario nel caso in cui il database sia compromesso, ma in questo caso dall'esterno, supponendo che non ci sia una violazione del database è questa impostazione più suscettibile alla forzatura bruta rispetto a memorizza e abbina la chiave unhashed?

Nota: questa orribile impostazione non sostituisce l'impostazione della password reale. Qualcuno che "chiama i colpi" vuole una seconda password per accedere a una determinata funzione, e vuole che sia lunga e che venga chiamata una "chiave". Dopo averlo codificato, avrò l'opportunità di dimostrare quanto sia sciocco questo. La mia domanda qui riguarda solo la suscettibilità di una stringa di 128 caratteri che viene forzata a forza bruta rispetto al suo hash salato di 40 caratteri che è forzato a forza bruta.

    
posta dotancohen 05.03.2013 - 07:41
fonte

4 risposte

8

Entropia è una parola grossa per un concetto matematico (nel contesto della crittografia), che viene così chiamato da un'analogia approssimativa con l'"entropia" usata in fisica. Qui, " n bit di entropia" significa, più o meno, che ci sono 2 n possibili valori per la chiave.

Per sicurezza, non c'è alcuna differenza pratica oltre 100 bit di entropia. Vogliamo che le nostre chiavi siano al sicuro da search esauriente e questo si ottiene quando si provano tutte le chiavi possibili, o almeno una parte sostanziale dello spazio chiave, è ridicolmente non fattibile con tecnologia esistente. I crittografi hanno a lungo usato "80 bit" come soglia per quello; 100 bit dovrebbero tenere conto dei miglioramenti tecnologici e un margine constrongvole (a queste dimensioni domina l'energia, non legge di Moore ). Oltre questa dimensione, la ricerca esauriente è completamente sconfitta e non c'è una sconfitta più grande di quella.

Pertanto, mentre la "chiave di 128 caratteri" ha potenzialmente 512 bit di entropia (supponendo che i "caratteri" siano cifre esadecimali) e l'hash SHA-1 abbia "solo" 160 bit (la dimensione di uscita di SHA-1) entrambi sono ancora molto lontani nel regno del "non si può fare", e non ha senso, da un punto di vista della sicurezza, dire che uno è "più sicuro" dell'altro. Entrambi sono immuni dalla ricerca esauriente.

Di conseguenza, non c'è bisogno di un sale qui. Sali riguardano l'impedire il parallelismo e le precomputazioni: presumono che l'attaccante possa eseguire una ricerca esaustiva su una chiave, e vorrà per eseguire la stessa attacco a più chiavi. I sali garantiscono che il costo dell'attacco per dieci chiavi sia dieci volte il costo di una chiave. Con una chiave da 100+ bit, il costo per un attacco one va ben oltre ciò che può essere fatto, quindi non ha molto senso impedire il parallelismo. Detto altrimenti, se i sali cambiano qualsiasi cosa per la situazione di sicurezza, allora l'attaccante è un dio, e dovresti sacrificare i buoi per calmarlo, non cercare di contrastarlo con le tue pacchiane funzioni di hash.

    
risposta data 05.03.2013 - 15:06
fonte
1

SHA1 produce un output a 160 bit. È spesso rappresentato in base16, che produce una stringa di 40 caratteri. Indipendentemente dalla sua rappresentazione di base, è ancora un hash di 160 bit. SHA1 non è una funzione di hash ideale in quanto soffre di punti deboli noti, SHA-256 è una scelta migliore, e SHA3 sarà luogo comune molto presto.

Le tabelle Rainbow sono tabelle di ricerca che consentono a un utente malintenzionato di determinare rapidamente l'input del testo semplice in una specifica funzione hash. Una generazione di esempio sarebbe costituita da tutte le stringhe alfanumeriche-miste tra 6 e 9 caratteri. Creare una tabella per l'input puramente esadecimale, a-f, 0-9 significa uno spazio di input molto più piccolo e quindi più facile da generare. 128 caratteri ASCII a 8 byte è 128 * 8 o 1024 bit di informazioni e 128 caratteri in codifica esadecimale sono 128 * 4 che è 512 bit di informazioni. Anche 512 bit è uno spazio abbastanza grande da impedire la forza bruta. Non esiste una "scorciatoia" per attaccare una grande dimensione di input per una funzione hash, ma nulla ti impedisce di usare SHA-512.

Ci sono probabilmente altre minacce più gravi a un sistema di sicurezza che ha un sistema di password arbitrario. Il motivo per cui le nostre password hash è la difesa da una violazione del database . Questo perché un utente malintenzionato è costretto a rompere l'hash della password in modo che sia utile. Se non hai intenzione di fallire, lo stai facendo male.

    
risposta data 05.03.2013 - 07:58
fonte
1

Se avessi un input di 40 caratteri e un hash di 40 caratteri, supponiamo che il rapporto tra password e hash sia compreso tra 1 e 1. Ciò significa che per ogni password ci sarà un singolo hash, ma non è garantito che una password abbia esattamente un hash, è solo approssimativa.

Considerando di avere 128 caratteri e di produrre un hash di 40 caratteri, ci saranno circa 3,2 password per ogni hash se si considera ogni possibile combinazione di 128 caratteri.

È possibile che una password di 128 caratteri abbia lo stesso hash di una password di 1 carattere! Non è molto probabile ma è sicuramente possibile ed è una potenziale debolezza .

In conclusione, quando hai più input che uscite, dovrai riutilizzare alcune delle uscite per soddisfare tutti gli input.

    
risposta data 05.03.2013 - 08:32
fonte
-2

Tenete a mente da un punto di vista della sicurezza, le funzioni di hash come SHA-X, MD5 e altri hash "veloci" sono inclini alle tabelle arcobaleno [1]. Sebbene sia difficile calcolare 160 bit di entropia, se una funzione di hash può essere eseguita in parallelo attraverso un dominio di input molto ampio, un hacker potrebbe memorizzare questa precomputazione e con facilità essere in grado di invertire qualsiasi password debole.

Salting aiuta in modo drammatico, specialmente se c'è un sale diverso usato per ogni password, tuttavia è molto più efficiente usare una lenta, inefficiente funzione di hash della memoria come bcrypt o scrypt a causa del parallelismo sulla GPU. Vedi [2] per una spiegazione della dimensione e del costo della password per decifrare password di diverse lunghezze.

[1] - link

[2] - link

    
risposta data 22.07.2014 - 01:08
fonte

Leggi altre domande sui tag