È una cattiva pratica prefisso il mio hash con l'algoritmo usato?

54

Diciamo che ho un database con un gruppo di utenti al suo interno. Questo database utente normalmente ha una password con hash per utente. Sarebbe una cattiva pratica prefixare questo hash con l'algoritmo di hash utilizzato?

Ad esempio, invece dell'hash aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d , memorizzo sha1_aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d , poiché il metodo per creare l'hash è SHA1.

Ho notato che Argon2 fa questo, e in realtà penso che sia abbastanza conveniente, perché rende più facile la migrazione parziale a algoritmi di hashing più recenti per i nuovi utenti nel tempo.

Non uso SHA1 nel mio codice di produzione per le password. SHA1 è stato scelto in modo casuale. Questa domanda non riguarda l'uso del metodo di hashing.

    
posta Mathias Lykkegaard Lorenzen 08.11.2018 - 14:25
fonte

5 risposte

116

Molti diversi sistemi di hashing delle password fanno questo. Il tipo di meccanismo di hashing utilizzato non dovrebbe essere (e non dovrebbe essere necessariamente) un segreto. Il principio di Kerckhoffs dice:

A cryptosystem should be secure even if everything about the system, except the key, is public knowledge.

Quindi, se il tuo sistema è correttamente protetto, non dovrebbe importare se il meccanismo di hash è esposto.

    
risposta data 08.11.2018 - 14:28
fonte
39

Sono d'accordo con schroeder che questo è OK da fare. Anche senza prefisso, un utente malintenzionato può probabilmente capire quale algoritmo stai utilizzando. E comunque, è la forza dell'algoritmo di hashing che protegge le password, non la segretezza dell'algoritmo.

Si noti che molti algoritmi e librerie di hashing lo fanno già per te. Incorporano tutte le informazioni rilevanti - algoritmo, fattori di costo, sale, l'hash effettivo - in un'unica stringa serializzata. Vedi ad esempio il Modular Crypt Format o il PHP password_hash funzione. Quindi non fare il tuo schema personale. Se stai usando una libreria di hashing di discesa, ne hai già una.

Non usare SHA1 alle password di hash, però. Non è OK

    
risposta data 08.11.2018 - 14:41
fonte
13

No, non è una cattiva pratica, e probabilmente dovresti conservare questa informazione.

Come si osserva, questo consente di modificare l'algoritmo per nuove password in qualsiasi momento, senza invalidare le password esistenti di tutti gli utenti (in questo modo si tende a renderlo impopolare, per qualche motivo).

C'è una discussione che permette a un utente malintenzionato di cercare le password più vecchie e deboli per attaccare prima, ma non hai affatto ridotto la loro sicurezza (assumendo il principio di Kerckhoff, che l'algoritmo stesso non deve necessariamente essere un segreto ).

    
risposta data 08.11.2018 - 16:59
fonte
9

È buona norma archiviare l'algoritmo di hashing, ma già le funzioni di hashing della password corrette come Argon2 e PBKDF2 si occupano di questo. È comunque una pratica sbagliata usare SHA1 o SHA256 da soli per l'hashing della password perché sono una quantità fissa (e relativamente piccola) di lavoro da decifrare usando attacchi di dizionario e forza bruta. Queste password dovrebbero essere migrate su una funzione di hashing sicura rimodellando la password al loro prossimo accesso. Vedi link per i dettagli.

    
risposta data 08.11.2018 - 20:27
fonte
1

Non è una cattiva pratica, è in realtà una cosa comune da fare. Infatti se apri il file /etc/shadow su una macchina Linux vedrai la tua password hash con il prefisso $ x $ salt $ dove x è un numero che indica quale algoritmo di hashing è stato usato.

Ora alcuni aspetti da considerare:

  • non utilizzare SHA1 direttamente come algoritmo di hashing. Usa invece bcrypt, scrypt o argon2 (che hai menzionato ma non può essere ripetuto troppo). Questi usano un semplice algoritmo di hashing come SHA1 come base, ma lo eseguono in un modo speciale che lo rende resistente agli attacchi.
  • per motivi pratici, dal momento che stai usando un database e non un file, potresti voler memorizzare il metodo di hashing e saltarlo in righe separate. Tuttavia, puoi anche scegliere di memorizzare la stringa che inizia con $ x $ salt $ nel tuo database e analizzare il metodo salt e hashing da quella stringa nel momento in cui controlli la password. Probabilmente è abbastanza veloce da non fare alcuna differenza significativa. E in entrambi i casi la sicurezza del tuo sistema sarà la stessa.
risposta data 09.11.2018 - 19:11
fonte

Leggi altre domande sui tag