2014-07-17 12 views
5

ho usato crypt() per hash della password, con un sale Blowfish come questo:php crypt() Lunghezza sale Blowfish compatibile

$ 2a $, 2 cifre, $, 21 caratteri in [a-zA -Z0-9]

Qui ho fatto un errore che la lunghezza dei caratteri dopo il terzo $ è 21 non 22. Ma ha funzionato correttamente, quindi non ho trovato l'errore.

Funziona sul mio desktop che esegue windows e php 5.4.4 e su AWS ec2 che esegue Amazon linux con php 5.3.x, con quello troppo corto.

Un giorno ho aggiornato AWS php a 5.5.14. allora il problema si è verificato. crypt() restituisce * 0 sempre.

Dopo qualche tentativo, ho aggiunto un $ alla fine del sale così, diventa 22 caratteri. E funziona di nuovo e restituisce la stessa stringa di hash di prima. Anche se non obbedisce alla regola blowfish, i caratteri dovrebbero essere [./a-zA-Z0-9]

Ma ora io duplica questo sito su un'altra macchina che esegue openSuSE 13.1 con php 5.5.14, Questo sale fallito ancora.

Ho eseguito il downgrade del php alla 5.4.20 ma non l'aiuto.

Il nuovo sito ha ancora bisogno del vecchio database quindi devo fare in modo che l'hash della password funzioni.

Che cos'è la libreria o il modulo che influisce su questo problema di compatibilità dell'errore di lunghezza di blowfish? Tt non sembra la versione di PHP. AWS 5.5.14

Oppure c'è un altro char magico che può salvarmi di nuovo? Ho provato a sostituire la coda $ a ciascuno in [./a-zA-Z0-9] ma non fortunato, la stringa hash è diversa ....

+0

Invece di generare da soli il sale, perché non usi le [funzioni di hashing] di PHP (http://php.net/manual/en/function.password-hash.php)? – PeeHaa

+0

Il sistema esistente deve funzionare ancora. –

+0

"Ma ora costruisco un altro sito in openSuSE 13.1 con php 5.5.14, Questo salt non è riuscito di nuovo." <- Non c'è alcun motivo per cui non è possibile utilizzare gli strumenti appropriati per il lavoro lì – PeeHaa

risposta

2

Per prima cosa raccomando vivamente di utilizzare le nuove funzioni password_hash() e password_verify() per generare e verificare nuovi hash. Naturalmente questo non risolve il tuo problema con i vecchi hash, ma potrebbe essere una buona idea contrassegnarli come vecchi, in modo che possano essere aggiornati al prossimo login dell'utente.

Per questo vecchio hash i proverei a verificarli, generando un salt con un ultimo carattere valido 22. La funzione crypt utilizza in realtà solo una parte dei bit del carattere 22 (126 bit del sale anziché 128). Quindi gruppi dell'ultimo carattere 22 finiranno nello stesso valore hash.

vedere la risposta a questa domanda Why does crypt/blowfish generate the same hash...

Se si prova tutti i caratteri rilevanti [.Oeu] come il carattere 22, la possibilità è bene che una combinazione genererà lo stesso risultato come il sale non valido.

EDIT:

Dal momento che il sale utilizzato diventa parte della password-hash, si dovrebbe essere in grado di vedere ciò che è stato utilizzato come carattere 22 (il carattere 22 dopo il terzo $).

+0

senza fortuna. Ho provato tutti i caratteri consentiti. Tra la parte sale dell'hash includiamo solo 21 caratteri. il 22 ° carattere non è il 22esimo sale corretto ... –

+0

@JackyJou - Come fai a sapere che il sale contiene solo 21 caratteri? La funzione crypt avrebbe potuto prelevare alcuni bit dal '$' o averlo imbottito. Potresti mostrarci un tale hash, uno di cui conosci la password, ma che non viene utilizzato da un utente? – martinstoeckli

+0

l'hash era "$ 2a $ 13 $ xxxxxB9EUUAe7wKKdye36" e funziona all'inizio. su AWS php 5.3.xe sul mio Windows 5.4.4 –

1

Utilizzare (di nuovo) '$' come ultimo carattere per far funzionare le password se si esegue il downgrade a PHP 5.4.

Questa non è tuttavia una soluzione a lungo termine.L'utilizzo di '$' come ultimo carattere ha reso tutte le tue password in avanti-incompatibili, perché non è un personaggio Base64 valido (indipendentemente dal fatto che sia Base64 normale o compatibile con bcrypt).

Fintanto che è possibile utilizzare PHP 5.4, e ciò significa che finché PHP 5.4 è ufficialmente supportato, è necessario ri-hash tutte le password precedenti ogni volta che vengono utilizzati. Dopo che il supporto per PHP 5.4 è stato eliminato, non avrai altra scelta se non quella di generare nuove password casuali per gli utenti che sono rimasti con il vecchio schema di hashing e inviarli via e-mail.

Devo inoltre suggerire di utilizzare password-compat package per le password aggiornate. Ti darà le funzioni password_*() che sono altrimenti disponibili solo su PHP 5.5+. L'autore del pacchetto è la stessa persona che ha implementato le funzioni in PHP stesso, così puoi essere sicuro che sia al sicuro e al 100% compatibile, offrendoti compatibilità diretta quando esegui l'upgrade a 5.5+.

+0

uso '$' non funziona su openSuSE 13.1 con supporto php 5.4 o 5.5, ma funziona su AWS ec2 che è php 5.5 .... Sono così confuso ... –

+0

Hmm ... Bene, 'cripta () 'si basa sulle API sottostanti del sistema operativo, quindi avere PHP 5.5 tecnicamente non garantisce nemmeno la disponibilità di Blowfish. Tuttavia, non vedo come si lavori con "$" su un normale setup di PHP 5.5, ne sono sconcertato. – Narf