Quanto è sicuro BCRYPT (SHA1 (password)) [duplicato]

17

Questa domanda è un fork di una domanda precedente qui: È sicuro / saggio memorizzare un valore nello stesso campo della password con hash?

Supponiamo che tu esegua un portale web e memorizzi le password negli hash SHA1. Come si aggiorna questo sugli hash BCRYPT?

In genere, attendi che gli utenti effettuino l'accesso e ri-hash le loro password (dal testo in chiaro che hanno inserito) a BCRYPT. Ma potrebbe passare un po 'di tempo prima che tutti gli utenti accedano alla tua piattaforma e ci saranno sempre utenti inattivi che non torneranno mai più.

Una proposta separata (che ho sentito per la prima volta da Troy Hunt) era BCRYPT le password SHA1 esistenti nel database. Effettivamente saresti BCRYPT(SHA1(plaintext_password)) . In questo modo tutti gli utenti del sistema vengono aggiornati a BCRYPT in una sola volta, indipendentemente dalla loro attività.

In questo modo, una violazione del tuo database, non espone gli utenti che non hanno ancora effettuato l'accesso e che si trovano ancora su SHA1.

La domanda è:

  1. Is BCRYPT(SHA1(plaintext_password)) è equivalente in sicurezza a BCRYPT(plaintext_password)
  2. Se non - Perché? E il divario è abbastanza ragionevole da considerare questa opzione?

La domanda si concentra su BCRYPT (SHA1) ma potrebbe facilmente applicarsi a qualsiasi due algoritmi di hash con uno più strong applicato per ultimo.

    
posta keithRozario 10.04.2018 - 04:56
fonte

2 risposte

19

Prima di tutto, grazie per il tempo dedicato a determinare come farlo correttamente e migliorare la sicurezza per i tuoi utenti!

La migrazione della memorizzazione delle password tenendo conto degli hash precedenti è relativamente comune .

Per il tuo scenario di migrazione, bcrypt(base64(sha1(password))) sarebbe un equilibrio ragionevole . Evita il problema nullo ( importante - tu sicuramente non lo fai Non voglio escludere il livello base64! ), oltrepassa il limite nativo di 72 caratteri di bcrypt ed è compatibile al 100% con gli hash esistenti.

Semplicemente cancellerai tutti gli SHA1 esistenti con bcrypt(base64(sha1)) e poi cancellerai tutte le nuove password con la sequenza completa. (Potresti anche usare SHA256 invece, anche se ciò aumenterebbe leggermente la complessità del codice, per verificare se SHA1 o SHA25 fossero usati (o per provarli entrambi e passare se entrambi hanno successo) A lungo termine, SHA256 sarebbe più resistente alle collisioni , quindi sarebbe una scelta migliore).

Per resistere alla forza bruta, ciò non sarebbe solo equivalente a bcrypt, ma sarebbe teoricamente superiore (anche se in pratica 72 caratteri sono così grandi per la memorizzazione delle password di quanto non lo siano effettivamente).

Consiglio bonus:

  • Assicurati di utilizzare un fattore di lavoro bcrypt sufficientemente elevato per resistere agli attacchi offline: il valore massimo che gli utenti possono tollerare, 100 ms o superiore (probabilmente almeno un fattore di lavoro di 10). Per velocità inferiori a 1 secondo, bcrypt potrebbe effettivamente essere più lento per l'attaccante (meglio per il difensore) rispetto alle sue moderne sostituzioni scrypt e Argon2 (YMMV).
  • Memorizza il valore predefinito per il fattore di lavoro come variabile configurabile a livello di sistema, quindi puoi aumentarlo periodicamente non appena le velocità dell'hardware sottostante diventano più veloci (o più distribuite).
risposta data 10.04.2018 - 07:19
fonte
4

Questo limiterà lo spazio delle chiavi a circa 2 160 , poiché SHA-1 emette 20 byte di digesti, ma in ogni caso va bene. In effetti, bcrypt ha un limite di input di 72 byte, quindi non è affatto raro che gli utenti eseguano l'hash di una password usando prima un hash veloce e crittograficamente sicuro. Poiché il limite è maggiore della dimensione digest di SHA-1, puoi invece utilizzare un hash con un digest più grande. Nota che il problema nullo richiede che il digest sia convertito in un'altra codifica, come base64.

Se hai già un database pieno di hash SHA-1, è perfettamente corretto eseguirli tramite bcrypt.

    
risposta data 10.04.2018 - 05:10
fonte

Leggi altre domande sui tag