2012-04-05 25 views
9

Sto lavorando su un sistema che hashing password utente con MD5 (senza sale). Voglio memorizzare le password in modo più sicuro utilizzando SHA-512 e un sale.Usa SHA-512 e salta all'hash una password hash MD5?

Sebbene sia abbastanza semplice da implementare per le password future, vorrei anche aggiornare le password hash MD5 esistenti, preferibilmente senza obbligare tutti gli utenti a modificare le loro password. La mia idea è di usare solo SHA-512 e un salt appropriato per cancellare l'hash MD5 esistente. Posso quindi impostare un flag nel database che indichi quali password sono state sottoposte a hash da testo semplice e quali sono state sottoposte a hash da un hash MD5. Oppure potrei provare entrambi quando autenticano gli utenti. O anche solo hash nuove password con MD5 e poi SHA-512/salt, in modo che possano essere trattate come le vecchie password.

Programmaticamente, non penso che questo sarà un problema, ma non so abbastanza di crittografia/hashing per sapere se sto compromettendo la qualità dell'hash in alcun modo applicando un SHA-512/salare hash a una password che era già hash MD5. Il mio primo istinto è che, semmai, sarebbe ancora più forte, un tasto molto leggero che si allunga.

Il mio secondo istinto è che non so davvero di cosa sto parlando, quindi farò meglio a chiedere consiglio. qualche idea?

+0

SHA-512 offrirà pochissimi miglioramenti rispetto a MD5 (ad esempio: 'MD5 (salt + password)' è praticamente equivalente a 'SHA512 (salt + password)'). Le funzioni di hash di uso generico come MD5 e la famiglia SHA erano ** non ** costruite per memorizzare le password. Usa bcrypt. – NullUserException

+0

Molto vero. In realtà intendevo fare stretching chiave, ma non ho chiarito questo nella mia domanda. Ho finito per usare PBKDF2 invece di implementare ingenuamente il mio algoritmo di allungamento della chiave. –

risposta

6

La composizione della funzione con primitive crittografiche è pericolosa e non dovrebbe essere eseguita se evitabile. La soluzione comune per il tuo tipo di problema è di mantenere entrambi gli hash per un periodo di migrazione, usando il nuovo hash dove possibile e aggiornando in modo trasparente le vecchie password (quando controlli una password e la combina, rihash con il nuovo algoritmo e la memorizza)

Questo non funzionerà se si dispone di uno schema basato su una richiesta di risposta in cui non si vede la password in chiaro, ma poiché sembra che ci sia un sale memorizzato che non cambia, presumo che l'applicazione esegua l'hashing .

+0

Questa è un'ottima risposta. Sono già stato implementato esattamente questo tipo di soluzione ed è un ottimo modo per farlo. – jeffsix

+0

Grazie per il suggerimento sul rimodellamento trasparente quando l'utente effettua il login! Avete dei collegamenti che spieghino perché applicare un hash SHA-512 a un valore hash MD5 è meno sicuro dell'applicazione di un hash SHA-512 a una password in testo semplice? Sono interessato a sapere perché ... –

+1

@JeremiahOrr: Per la tua specifica applicazione, l'uso corretto di un sale abbastanza lungo e imprevedibile farà molto di più in termini di sicurezza rispetto alla modifica dello schema di hashing. Come spiegato da j13r, l'applicazione di SHA su MD5 non amplierà lo spazio di possibili hash, poiché sono vincolati dai possibili risultati di MD5. Inoltre, usare una funzione unidirezionale appositamente ottimizzata per le password sarebbe ancora meglio, ad esempio [PBKDF2] (http://en.wikipedia.org/wiki/PBKDF2). – mensi

1

Fidati del tuo secondo istinto. Usa una libreria esistente creata appositamente per le password di hashing invece di provare a crearne una tua.

Probabilmente ha cancellato le nuove password con MD5 e poi ha cancellato l'MD5 con la libreria di hashing delle password. In tal modo, puoi mantenere la retrocompatibilità con le tue vecchie password.

I.e. password_hash (tutti i vecchi, le password md5'd) e password_hash (MD5 (nuove password))

(Attenzione: io non sono un esperto di crittografia)

http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

+0

Oh, non ho intenzione di preparare la mia libreria di hashing, ho solo bisogno di sapere cosa fare con le password hash MD5 esistenti! –

+0

Non sono un esperto di crittografia, ma eseguirò semplicemente una funzione di hashing delle password sulle password MD5 esistenti. Per le nuove password, devi prima eseguire il vecchio algoritmo MD5, quindi inviarlo a una corretta funzione di hashing della password. Questo, o puoi in qualche modo segnare se la password sta usando il vecchio o il nuovo algoritmo nel database (o ovunque tu lo stia salvando). – tangrs

+0

@tangrs Anche le sue password originali sono hash MD5, sono già protette. Vuole passare a SHA-512 con sale che è più sicuro. Perché lo consiglieresti a lui un doppio hashing? Ciò non risolverebbe ancora il problema di come distinguere tra password nuova e vecchia. E raddoppiare l'hash è la sicurezza attraverso l'oscurità, che è tanto buona quanto nessuna sicurezza, perché nessuno sa cosa diavolo sta succedendo e come mantenerlo. – Churk

4

Se MD5 hash con primo, avrai solo la diffusione di MD5 (128 bit). Una grande parte dello spazio di SHA512 non sarà coperta dalle tue password. Quindi non approfitti di SHA512, ma non sarà peggio di MD5.

Hai il vantaggio che se qualcuno ottiene l'hash SHA512 e non conosce il sale (ciò che devi forzare in qualche modo) non può cercare gli hash e ottenere le password - qualcosa che sarebbe possibile con il Database MD5 che hai ora.

Quindi sì, è possibile ripetere semplicemente le password MD5 esistenti. Ma come spiegato nel primo paragrafo, sarebbe una cattiva idea applicare MD5 a tutte le nuove password e poi cancellarle come SH512. Un'implementazione facile sarebbe quella di avere un campo "salato" booleano nel database vicino agli hash (ma non mettere il sale lì).

+0

'ma non mettere il sale lì '- l'intero punto di un sale è che non deve essere tenuto segreto e può essere messo semplicemente in chiaro accanto ai valori hash (hai un hash unico per password!). Inoltre: "hashing una password MD5 con SHA-512 non farà alcun danno" sulla base di fatti reali o solo di qualche intuizione? Poiché in generale l'applicazione di più hash in sequenza può causare più danni che benefici. – Voo

+0

Il punto di una funzione di hash è che fornisce una mappatura univoca tra una stringa di dimensioni variabili e un numero di n bit. Qualsiasi buona funzione di hash evita le collisioni e in effetti è estremamente difficile produrre collisioni su SHA-512 e persino su MD5 (a meno che non si disponga di una lunghezza arbitraria, che non si trova nelle password). Mappare un valore di 128 bit in uno spazio di 512 bit è banale da fare (hai 2^(512-128) valori inutilizzati). Le collisioni (che è il danno) sono estremamente improbabili che si verifichino (probabilità 2^(128-512)). – j13r

0

Se si guarda al modo in cui la maggior parte delle persone di sicurezza e della sicurezza bancaria esegue la modifica della password.Molti di loro chiedono fondamentalmente a chi utilizza il vecchio metodo di crittografia per creare una nuova password. Penso che tu sia la prima soluzione per mettere un flag su tutti gli utenti di password MD5 esistenti e informarli che devono creare una nuova password e migrarli lentamente al nuovo sistema. In questo modo, quando risolvi il problema nel sistema, se qualcosa va storto non ti verrà chiesto se si tratta di un nuovo utente o di uno vecchio. Abbiamo doppio hashing o single? Non dovrebbe mai confrontare due hash come una possibile risposta, perché se MD5 ('abc') => 123, SHA ('NO') => 123, significa che qualcuno potrebbe aver inserito la password sbagliata ma ancora entra.