Password che frulla senza un sale unico

0

Ho una domanda sull'hash della password. Questa non è una domanda sul metodo BEST POSSIBLE delle password di hashing, ma piuttosto una domanda più utilitaristica su ciò che è sufficiente per cancellare una password senza che le tabelle arcobaleno standard rappresentino un problema.

Lasciatemi delineare uno scenario ipotetico. Si dispone di un'applicazione progettata senza sali unici e, per qualsiasi motivo di progettazione, sarebbe un'enorme modifica modificare l'applicazione in modo che funzioni con un sale unico per ogni singolo utente. Quindi, invece di riscrivere una parte enorme dell'applicazione, stiamo cercando un modo per accedere alle password hash più sicure di un puro SHA1 (o qualsiasi altro algoritmo di hashing standard), ma non coinvolge i sali unici.

Fornirò due esempi di soluzioni che non implicano sali unici. Ognuno di loro ha l'ovvio vantaggio di rendere inutile una tabella arcobaleno per un puro SHA1 (o qualsiasi altro algoritmo di hashing standard). Ognuno, tuttavia, ha lo svantaggio di essere in grado di creare una tabella arcobaleno per quella particolare strategia. Ma se ci pensi, usare un sale unico ha la stessa vulnerabilità, se tu dovessi scegliere come target un singolo utente.

L'idea più semplice è quella di disporre di un singolo salt per tutte le password hard-coded. Il secondo è quello di creare un algoritmo più complicato, come la suddivisione di una password in due da un insieme definito di regole, l'hashing di ciascuno, quindi l'hashing della concatenazione dei due hash parziali e l'archiviazione. Questo può essere esteso a qualsiasi algoritmo che ti piace.

Questo metodo è sufficiente per la maggior parte delle applicazioni? Nessuno dei due è ovviamente sicuro come un sale unico per ogni utente, ma se si targetizza un utente specifico non sembra né più né meno sicuro se si conosce il sale per quel particolare utente.

È corretto? Ed è una soluzione praticabile per alcuni (o forse più) casi?

    
posta 01.05.2014 - 03:44
fonte

4 risposte

2

La logica per i sali unici non è semplicemente quella di combattere i tavoli arcobaleno. Se l'intero database di password viene sottoposto a hash senza sali (o con un solo sale), un utente malintenzionato può attaccare l'intero database delle password contemporaneamente anziché essere costretto ad attaccare ciascuna password individualmente.

Inoltre, come ha sottolineato mcdowella, un database delle password che non è protetto da sali unici può potenzialmente essere vittima di un utente malintenzionato estrapolando informazioni dal fatto che si osservi che più utenti condividono la stessa password.

Nessuna delle tue soluzioni risolve uno di questi problemi. È possibile rendere l'attacco più costoso dal punto di vista computazionale utilizzando qualcosa di più sicuro rispetto a sha1 (ad esempio un conteggio ad alta percentuale PBKDF), ma questo non è un sostituto per i sali unici. Sono facili da implementare e il rapporto costi / benefici della salatura unica in termini di tempo di calcolo aggiuntivo e maggiore difficoltà di attacco è migliore di qualsiasi altro singolo approccio.

    
risposta data 01.05.2014 - 07:10
fonte
2

Per prima cosa leggi le modi normali per eseguire l'hashing delle password e sull'uso di Pepper . Quindi dovresti considerare se davvero non puoi memorizzare alcuna informazione a fianco dell'hash nel tuo database, ad es. come ha suggerito mcdowella. Se hai il pepe giusto nel tuo hash, il tuo sale non deve essere casuale ma solo diverso per ogni cambio di password. Ad esempio, usa l'ora corrente in millisecondi e l'ID account per generare il sale (puoi concatenarli o anche cancellarli una volta con SHA * se la lunghezza variabile è un problema per il tuo database). Se per qualche motivo non è possibile memorizzare altro che l'hash includa almeno l'ID account come salt nello schema di hashing della password. E come sempre con l'hashing della password: usa una lenta funzione hash (ad eccezione dell'idea precedente per la generazione di sale).

    
risposta data 01.05.2014 - 10:43
fonte
1

Un problema con un algoritmo che non ha sali univoci è che due utenti con la stessa password avranno lo stesso valore. Se un utente vede questo, conosce l'altra password. Se un attaccante esterno lo vede, ha un suggerimento che gli utenti hanno scelto una password comune, e quindi debole. Non puoi usare un salt unico e memorizzarlo formattato come parte della password hash? Per esempio. memorizza "SALT # HASHVALUE" come password con hash.

    
risposta data 01.05.2014 - 06:38
fonte
0

Mi dispiace rispondere alla mia domanda così presto, ma StackOverflow ha avuto alcune buone risposte suggerite. Come ci si potrebbe aspettare, tutto si riduce al tempo di calcolo. Se si utilizza un algoritmo che impiega un secondo per eseguire l'hash di una password, è possibile moltiplicare che i miei milioni generano il carico di calcolo su una macchina che tenta di generare una tabella arcobaleno per il proprio algoritmo. Quindi, suppongo, con o senza sali unici, dovresti creare quanti più passaggi possibile per hash una password senza alcun carico enorme sul tuo server. Puoi eseguire il tuo input attraverso lo stesso algoritmo ricorsivamente 1000 volte. Puoi diventare più complicato di così. Tutto dipende da quanto calcola ci vuole per hash una password individuale.

    
risposta data 01.05.2014 - 04:10
fonte

Leggi altre domande sui tag