Salt non casuale per gli hash delle password


89

AGGIORNAMENTO: Recentemente ho imparato da questa domanda che nell'intera discussione qui sotto, io (e sono sicuro che anche altri lo hanno fatto) ero un po 'confuso: quello che continuo a chiamare un tavolo arcobaleno, in realtà è chiamato tabella hash. I tavoli arcobaleno sono creature più complesse e in realtà sono una variante di Hellman Hash Chains. Anche se credo che la risposta sia sempre la stessa (dal momento che non si riduce alla crittoanalisi), alcune delle discussioni potrebbero essere un po 'distorte.
La domanda: " Cosa sono le tabelle arcobaleno e come vengono utilizzate? "


In genere, consiglio sempre di utilizzare un valore casuale crittograficamente forte come salt, da utilizzare con funzioni hash (ad esempio per le password), come per proteggere dagli attacchi di Rainbow Table.

Ma è davvero necessario crittograficamente che il sale sia casuale? Qualunque valore univoco (univoco per utente, ad es. UserId) sarebbe sufficiente a questo proposito? In effetti, impedirebbe di utilizzare una sola Rainbow Table per decifrare tutte (o la maggior parte) le password nel sistema ...
Ma la mancanza di entropia indebolisce davvero la forza crittografica delle funzioni hash?


Nota, non sto chiedendo perché usare il sale, come proteggerlo (non è necessario), usando un singolo hash costante (non) o che tipo di funzione hash usare.
Solo se il sale ha bisogno di entropia o meno.


Grazie a tutti per le risposte finora, ma vorrei concentrarmi sulle aree che conosco (un po ') meno. Principalmente implicazioni per la crittoanalisi: apprezzerei di più se qualcuno avesse qualche input dal PoV cripto-matematico.
Inoltre, se ci sono vettori aggiuntivi che non sono stati considerati, anche questo è un ottimo input (vedi il punto @Dave Sherohman su più sistemi).
Oltre a ciò, se hai una teoria, un'idea o una buona pratica, ti preghiamo di supportarla con prove, scenari di attacco o prove empiriche. O anche valide considerazioni per compromessi accettabili ... Ho familiarità con Best Practice (B maiuscola P maiuscola) sull'argomento, vorrei dimostrare quale valore effettivamente fornisce.


EDIT: Alcune risposte davvero buone qui, ma penso che come dice @Dave, si tratta di Rainbow Tables per nomi utente comuni ... e anche possibili nomi meno comuni. Tuttavia, cosa succede se i miei nomi utente sono unici al mondo? Non necessariamente univoco per il mio sistema, ma per ogni utente, ad esempio indirizzo e-mail.
Non ci sarebbe alcun incentivo a costruire un RT per un singolo utente (come ha sottolineato @Dave, il sale non è tenuto segreto) e ciò impedirebbe comunque il raggruppamento. L'unico problema sarebbe che potrei avere la stessa email e password su un sito diverso, ma il sale non lo impedirebbe comunque.
Quindi, si torna alla crittoanalisi: l'entropia è necessaria o no? (Il mio pensiero attuale è che non è necessario dal punto di vista della crittoanalisi, ma è per altri motivi pratici.)


Devo dire che sono confuso da molte delle risposte seguenti. Il punto principale dell'utilizzo del sale è semplicemente impedire l'attacco della tavola arcobaleno, quindi qualsiasi cosa unica per l'utente dovrebbe fare in quanto costringe l'attaccante a ricreare una tavola arcobaleno per ogni sale. il mio 2c.
Goran

Se il sale è necessario per es. site, spesso gli ID negli URL. Se l'attaccante sa (e presumiamo che lo sappia) che la password salt è userid + username è abbastanza facile modificare l'attacco per evitare il valore salt.
dmajkic

@dmajkic, salt ha lo scopo di prevenire attacchi RT e differenziare le stesse password per utenti diversi. Questo è un dato di fatto, anche con i nomi utente.
AVID l'

@AviD: È vero. Ma se conosco il mio hash per il mio pass e so che salt è il mio nome utente, posso facilmente creare un valore di passaggio con hash per qualsiasi parola del dizionario e confrontarlo con l'hash del passaggio di qualcun altro. Ecco perché il tempo è meglio del nome utente.
dmajkic

1
Ho appena trovato un articolo sul sito Web del PHP Security Consortium che nel suo esempio utilizza un numero casuale con hash md5 come salt phpsec.org/articles/2005/password-hashing.html
helloworlder

Risposte:


156

Il sale viene tradizionalmente memorizzato come prefisso alla password con hash. Questo lo rende già noto a qualsiasi utente malintenzionato con accesso all'hash della password. L'uso del nome utente come salt o meno non influisce su tale conoscenza e, quindi, non avrebbe alcun effetto sulla sicurezza del singolo sistema.

Tuttavia, l'utilizzo del nome utente o di qualsiasi altro valore controllato dall'utente come salt ridurrebbe la sicurezza tra sistemi, poiché un utente che aveva lo stesso nome utente e password su più sistemi che utilizzano lo stesso algoritmo di hashing della password finirebbe con lo stesso hash della password su ciascuno di questi sistemi. Non lo considero una responsabilità significativa perché io, in quanto utente malintenzionato, proverei le password che un account di destinazione è noto per aver utilizzato su altri sistemi prima di tentare qualsiasi altro mezzo per compromettere l'account. Gli hash identici mi direbbero solo in anticipo che la password conosciuta funzionerebbe, non renderebbero l'attacco effettivo più semplice. (Si noti, tuttavia, che un rapido confronto dei database degli account fornirebbe un elenco di obiettivi con priorità più alta, poiché mi direbbe chi è e chi non sta riutilizzando le password.)

Il pericolo maggiore derivante da questa idea è che i nomi utente vengono comunemente riutilizzati: quasi tutti i siti che desideri visitare avranno un account utente denominato "Dave", ad esempio, e "admin" o "root" sono ancora più comuni - il che renderebbe costruzione di tabelle arcobaleno mirate agli utenti con quei nomi comuni molto più semplice ed efficace.

Entrambi questi difetti potrebbero essere efficacemente risolti aggiungendo un secondo valore di sale (fisso e nascosto o esposto come il sale standard) alla password prima dell'hashing, ma, a quel punto, potresti anche usare comunque il sale entropico standard. di inserire il nome utente in esso.

Modificato per aggiungere: molte persone parlano di entropia e se l'entropia nel sale è importante. Lo è, ma non per il motivo che la maggior parte dei commenti sembra pensare.

Il pensiero generale sembra essere che l'entropia è importante in modo che il sale sarà difficile da indovinare per un attaccante. Questo non è corretto e, in effetti, del tutto irrilevante. Come è stato sottolineato più volte da varie persone, gli attacchi che saranno influenzati dal sale possono essere effettuati solo da qualcuno con il database delle password e qualcuno con il database delle password può semplicemente guardare per vedere qual è il sale di ogni account. Che sia indovinabile o meno, non importa quando puoi banalmente cercarlo.

Il motivo per cui l'entropia è importante è evitare il raggruppamento dei valori del sale. Se il sale è basato sul nome utente e sai che la maggior parte dei sistemi avrà un account denominato "root" o "admin", puoi creare una tabella arcobaleno per quei due sali e creerà un crack per la maggior parte dei sistemi. Se, d'altra parte, viene utilizzato un sale casuale a 16 bit ei valori casuali hanno una distribuzione approssimativamente uniforme, è necessaria una tabella arcobaleno per tutti i 2 ^ 16 sali possibili.

Non si tratta di impedire all'aggressore di sapere cos'è il sale di un account individuale, si tratta di non dargli l'obiettivo grande e grasso di un singolo sale che verrà utilizzato su una percentuale sostanziale di potenziali bersagli.


Concordato. Metterei più enfasi sul riutilizzo dei nomi utente, poiché penso che sia l'attacco che ha più probabilità di avere successo contro sistemi ipotetici che utilizzano il nome utente come salt, che avrebbe fallito contro un sistema che utilizza salt casuale.
Steve Jessop,

Apprezzo il tuo punto di vista sulla sicurezza tra sistemi. Inoltre, immagino che in futuro non sia improbabile vedere tabelle arcobaleno specifiche dell'utente ...
AviD

@AviD: la pensi così? È un vettore di attacco abbastanza specifico.
David Grant,

2
Non per la generazione di sali, no. Gli unici attacchi che sono influenzati dal sale sono quelli effettuati direttamente contro le password con hash. Un attacco non può effettuare questo tipo di attacco a meno che non disponga di una copia del database delle password, che conterrà anche i sali. Poiché l'attaccante avrà già i sali in suo possesso, richiedono solo un'entropia sufficiente per evitare di avere più password hash con lo stesso sale, che qualsiasi RNG di base (P) fornirà.
Dave Sherohman,

3
@ acidzombie24: L'uso di un singolo salt fisso (di solito chiamato "nonce" nella mia esperienza) per tutte le password è meno sicuro rispetto all'utilizzo di un salt casuale univoco per ogni password, poiché consente comunque a un utente malintenzionato di determinare banalmente se due o più account condividono la stessa password. D'altra parte, il nonce verrebbe probabilmente memorizzato nel tuo codice piuttosto che nel database, quindi un utente malintenzionato che ha solo il tuo database non avrà accesso ad esso; per questo motivo, l'opzione più sicura è utilizzare sia un nonce a livello di sistema (memorizzato nel codice) che un salt per password (memorizzato nel database).
Dave Sherohman

29

L'uso di un sale ad alta entropia è assolutamente necessario per memorizzare le password in modo sicuro.

Prendi il mio nome utente "gs" e aggiungilo alla mia password "MyPassword" fornisce gsMyPassword. Questo è facilmente risolvibile usando una tabella arcobaleno perché se il nome utente non ha abbastanza entropia potrebbe essere che questo valore sia già memorizzato nella tabella arcobaleno, specialmente se il nome utente è breve.

Un altro problema sono gli attacchi in cui sai che un utente partecipa a due o più servizi. Esistono molti nomi utente comuni, probabilmente i più importanti sono admin e root. Se qualcuno creasse una tabella arcobaleno con sali con i nomi utente più comuni, potrebbe usarli per compromettere gli account.

Avevano un sale da 12 bit . 12 bit sono 4096 combinazioni diverse. Non era abbastanza sicuro perché oggi molte informazioni possono essere facilmente archiviate . Lo stesso vale per i 4096 nomi utente più utilizzati. È probabile che alcuni dei tuoi utenti sceglieranno un nome utente che appartiene ai nomi utente più comuni.

Ho trovato questo verificatore di password che calcola l'entropia della tua password. Avere una minore entropia nelle password (come usando i nomi utente) rende molto più facile per le tabelle arcobaleno poiché cercano di coprire almeno tutte le password con bassa entropia, perché è più probabile che si verifichino.


+1 per un buon punto, tuttavia, si stanno parlando di un potenziale enorme tavolo arcobaleno. Per coprire tutti i valori della lunghezza gsMyPassword (assumendo caratteri alfanumerici misti) sono necessarie 36 ^ 12 righe nella tabella!
David Grant,

Di seguito: il progetto della tabella arcobaleno distribuito ha 63.970 hash crackati, ma 36 ^ 12 è 4.738.381.338.321.616.896!
David Grant,

Grazie, e questo ha senso, ma come ha sottolineato il signor PotatoHead, stai ancora espandendo il tuo spazio oltre ogni ragionevole possibilità di cracking con RT. Inoltre, supponendo che i miei nomi utente contengano almeno 6-8 caratteri, quale valore aggiuntivo necessario fornisce l'entropia?
AVID l'

@ Patato: presumi una tabella arcobaleno contenente tutte le possibili combinazioni di caratteri alfanumerici. Non è necessario che sia così, una tabella arcobaleno efficace conterrà hash per password / hash comuni. Salt è lì per proteggersi dagli attacchi del dizionario o dalla combinazione rainbowtable / dictionary.
Guillaume

3
Usare il nome utente come sale è anche una cattiva idea per i sistemi in cui è presente un account con privilegi elevati dal nome prevedibile: "Administrator" su Windows, "root" su * nix, "sa" in MSSQL, ecc.
nessuno

8

È vero che il nome utente da solo può essere problematico poiché le persone possono condividere nomi utente tra diversi siti Web. Ma non dovrebbe essere problematico se gli utenti avessero un nome diverso su ogni sito web. Allora perché non renderlo unico su ogni sito web. Hash la password in qualche modo in questo modo

funzione hash ("www.yourpage.com /" + nome utente + "/" + password)

Questo dovrebbe risolvere il problema. Non sono un maestro della crittoanalisi, ma dubito che il fatto che non usiamo un'entropia elevata renderebbe l'hashish più debole.


Credo tu abbia ragione che questo sia sufficiente. Tuttavia, dato che gli hash sono un campo matematico complicato ed è molto probabile che i sali a bassa entropia rendano gli hash più facilmente indovinabili in futuro (specialmente quando gli hash si rompono), non scommetterei sulla sicurezza, quando il comprovato una soluzione più sicura non è molto più costosa.
Georg Schölly

7

Mi piace usare entrambi: un sale casuale per record ad alta entropia, più l'ID univoco del record stesso.

Anche se questo non aggiunge molto alla sicurezza contro gli attacchi al dizionario, ecc., Rimuove il caso marginale in cui qualcuno copia il proprio salt e hash su un altro record con l'intenzione di sostituire la password con la propria.

(Certo, è difficile pensare a una circostanza in cui ciò si applica, ma non vedo alcun danno in cinture e bretelle quando si tratta di sicurezza.)


Mi piace l'idea di associare la password all'utente. Ma se l'aggressore può cambiare la password può sicuramente cambiare anche l'id.
Georg Schölly,

Dipende da quale sia l'ID: io uso la chiave primaria della tabella, che non puoi davvero cambiare a piacimento. TBH, se l'hacker scrive sul tuo database, sei già in guai piuttosto grossi ...
teedyay

3
Nah, mi piace. Un aggressore è spesso un "insider". Potrei immaginare scenari in cui ciò che sta cercando non è nel database, ma se può sovrascrivere le credenziali nel database, può autenticarsi per fare ciò che vuole.
erickson

1
Buon punto. Troviamo che sia sempre più difficile aggiungere il primo utente a un nuovo database: abbiamo effettivamente reso le nostre applicazioni così sicure che a malapena possiamo hackerarle da soli. [Inoltre, utilizza un salt specifico per l'applicazione in modo da non poter copiare le credenziali da un database a un altro.]
teedyay

Alla fine ho trovato qualcuno che diceva questo: aggiungere qualcosa di specifico per l'utente al sale. Ciò evita che un intruso copi alcune credenziali su un altro utente e impedisce anche a un hacker di indovinare una password se riesce a raggiungere il campo hash e salt nella tabella. Un'altra cosa che mi piace fare: non usare un numero tondo di iterazioni nell'hashing. Non andare per 10k o 20k, ma piuttosto qualcosa come 19835.
Andrew

3

Se il sale è noto o facilmente indovinabile, non hai aumentato la difficoltà di un attacco del dizionario. Potrebbe anche essere possibile creare una tabella arcobaleno modificata che tenga conto di un sale "costante".

L'uso di sali unici aumenta la difficoltà degli attacchi del dizionario BULK.

Avere un valore del sale unico e crittograficamente forte sarebbe l'ideale.


2
Il punto centrale della tabella arcobaleno è che i valori sono pre-generati e che se stai generando la tabella per un valore (ad es. Password) PIÙ una data costante, questa è una tabella completamente diversa, e potresti anche prova direttamente il risultato dell'hash. :)
David Grant,

1
Un hash costante non vale nulla. Tutte le password possono essere violate utilizzando un'unica tabella arcobaleno. Lo scopo del sale è che è impossibile creare una tavola arcobaleno.
Georg Schölly,

1
@gs - Non vedo perché non puoi costruire una tabella arcobaleno che "includa" gli effetti di un sale costante. Lo spazio di attacco (la password) non sarà cambiato, quindi la tabella non avrà bisogno di crescere, sarà solo ricalcolata.
HUAGHAGUAH

@ Patato - dipende dal compromesso. Se i 20.000 accessi della tua azienda fossero tutti sottoposti ad hashing con lo stesso sale costante, potrebbe essere più economico calcolare una nuova tabella arcobaleno piuttosto che attaccarli tutti individualmente. Da qui la mia enfasi su "BULK".
HUAGHAGUAH

3

Direi che fintanto che il sale è diverso per ogni password, probabilmente starai bene. Il punto del sale, è che non è possibile utilizzare la tabella arcobaleno standard per risolvere ogni password nel database. Quindi, se applichi un salt diverso a ogni password (anche se non è casuale), l'aggressore dovrebbe fondamentalmente calcolare una nuova tabella arcobaleno per ogni password, poiché ogni password utilizza un salt diverso.

Usare un sale con più entropia non aiuta molto, perché in questo caso si presume che l'aggressore abbia già il database. Dato che devi essere in grado di ricreare l'hashish, devi già sapere cos'è il sale. Quindi devi memorizzare il sale, oi valori che compongono il sale comunque nel tuo file. In sistemi come Linux, il metodo per ottenere il sale è noto, quindi non serve avere un sale segreto. Devi presumere che l'attaccante che ha i tuoi valori hash, probabilmente conosce anche i tuoi valori di sale.


3
"Il punto cruciale è che non è possibile utilizzare la tabella arcobaleno standard per risolvere tutte le password nel database". Non sono d'accordo. Il punto è che non puoi usare una tabella arcobaleno standard per risolvere alcuna password. Se il sale è il nome utente, la tabella arcobaleno per "root" potrebbe rompere la pw di root.
Steve Jessop,

Questa è probabilmente l'unica regola che conta davvero. Fondamentalmente vuoi che la password sia qualcosa di unico nel tuo sistema, ma non importa quale sia. Potrebbe comunque essere qualcosa di semplice. Non hai bisogno di molta entropia.
Kibbee,

Questo era anche il mio pensiero, ma sono rimasto bloccato sul "probabilmente okay". Non vedo ancora questa teoria dimostrata, o almeno verificato che non ci siano implicazioni di crittoanalisi.
AVID l'

@onebyone: se il salt è costituito da nome utente + valore locale costante (io spesso uso ':'), allora ciò rovina ancora RT standardizzati, a meno che non ce ne siano una varietà che include nomi utente comuni e valori salt statici comuni. Sospetto piuttosto che non sia così.
nsayer

Insieme a nsayer. Potresti usare una stringa costante a livello di sistema, per cui non ci sarebbe un RT pregenerato, come # (D83d8, insieme al nome utente come il sale, e questo probabilmente impedirebbe qualsiasi attacco al tavolo arcobaleno.
Kibbee

3

La forza di una funzione hash non è determinata dal suo input!

L'uso di un sale noto all'attaccante ovviamente rende la costruzione di una tabella arcobaleno (in particolare per i nomi utente hard-coded come root ) più attraente, ma non indebolisce l' hash . L'utilizzo di un sale sconosciuto all'aggressore renderà il sistema più difficile da attaccare.

La concatenazione di un nome utente e una password potrebbe ancora fornire una voce per una tabella arcobaleno intelligente, quindi utilizzare un sale di una serie di caratteri pseudo-casuali, archiviati con la password con hash è probabilmente un'idea migliore. Ad esempio, se avessi il nome utente "potato" e la password "beer", l'input concatenato per il tuo hash è "potatobeer", che è una voce ragionevole per una tabella arcobaleno.

Cambiare il sale ogni volta che l'utente cambia la password potrebbe aiutare a sconfiggere attacchi prolungati, così come l'applicazione di una politica ragionevole per la password, ad esempio maiuscole / minuscole, punteggiatura, lunghezza minima, modifica dopo n settimane.

Tuttavia, direi che la tua scelta dell'algoritmo digest è più importante. L'uso di SHA-512 si rivelerà più doloroso per qualcuno che genera una tabella arcobaleno rispetto all'MD5, ad esempio.


La forza della funzione non cambia, ma cambia decisamente l'output. Se l'input può essere influenzato o conosciuto, allora forse si può dedurre qualcosa sul valore hash. Questo è il rischio.
Martin Carpenter,

@ Martin: l'unica cosa che dovresti essere in grado di dedurre dal valore hash se hai o meno una corrispondenza! Mettere "roota" o "rootb" (dove "a" e "b" rappresentano la password) in una funzione hash darà un output radicalmente diverso.
David Grant,

I sali sono noti a un attaccante che utilizza tabelle arcobaleno.
Georg Schölly,

Il server deve conoscere il sale non crittografato (per controllare la password rispetto all'hash), quindi si può dare per scontato che un attaccante abbia accesso al sale, o può ottenerlo molto facilmente.
Georg Schölly,

Giusto, giusto, questo è un dato di fatto - per essere più precisi, intendevo la forza dell'intero sistema crittografico (o -sottosistema, rispetto agli hash).
AVID l'

1

Il sale dovrebbe avere quanta più entropia possibile per garantire che se un dato valore di input viene sottoposto ad hashing più volte, il valore hash risultante sarà, il più vicino possibile, sempre diverso.

L'uso di valori di sale in continua evoluzione con quanta più entropia possibile nel sale assicurerà che la probabilità di hashing (ad esempio, password + salt) produrrà valori di hash completamente diversi.

Meno entropia nel sale, più possibilità hai di generare lo stesso valore di sale, quindi più possibilità hai di generare lo stesso valore di hash.

È la natura del valore hash essere "costante" quando l'input è noto e "costante" che consente agli attacchi di dizionario o alle tabelle arcobaleno di essere così efficaci. Variando il valore hash risultante il più possibile (utilizzando valori di sale di entropia elevati) assicura che l'hashing dello stesso input + random-salt produrrà molti risultati di valore hash diversi, sconfiggendo (o almeno riducendo notevolmente l'efficacia) della tabella arcobaleno attacchi.


Ancora una volta, non mi riferisco all'utilizzo di un singolo sale costante, piuttosto un valore non casuale, ma unico per l'utente. Ad esempio userId.
AVID l'

Il punto è che il tuo valore di sale non dovrebbe mai essere costante. Ogni singola cosa che hash, indipendentemente dal fatto che lo stesso valore di "input" o meno, dovrebbe avere un sale diverso. Dave Sherohman spiega gli svantaggi dell'utilizzo anche di valori univoci per l'utente che essenzialmente rimangono gli stessi con ogni calcolo hash.
CraigTP

-1

L'entropia è il punto del valore del sale.

Se c'è una "matematica" semplice e riproducibile dietro il sale, allora è lo stesso che il sale non c'è. Basta aggiungere il valore del tempo dovrebbe andare bene.


Non capisco questo commento. Dici "usa entropia" e poi: "usa tempo" ??
Martin Carpenter,

se Username è usato per il sale, non e 'abbastanza entropico. Ma se usi il nome utente + la data corrente, lo è, poiché è difficile indovinare quando è stato creato esattamente salt.
dmajkic

"abbastanza entropico" è soggettivo; è il tuo standard. Basare questo valore sul tempo potrebbe non essere adeguato.
Martin Carpenter,

Non esiste una cosa come "assoluta vera casualità". Sta a noi dire quando è "abbastanza buono". Se pensi che in questo caso il tempo non sia abbastanza buono, usa qualcos'altro. stackoverflow.com/questions/84556/...
dmajkic

In realtà, il punto di sale è che ogni risultato hash sia unico, al fine di prevenire (a) attacchi alla tabella arcobaleno e (b) identificazione identica della password. La domanda è: a che altro serve l'entropia, se non del tutto?
AVID l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.