php crypt - trailing simbolo del dollaro - estrae solo la parte di sale dall'hash - riempie il sale

2

Sto leggendo la funzione PHP crypt () . Ho alcune domande su di esso -

  1. Qual è il significato del segno "$" finale alla fine della stringa salt che vedo nella maggior parte degli esempi. Il manuale non dice esplicitamente nulla sulla conclusione della stringa salata con esso.

  2. È comunque possibile estrarre solo la porzione di sale dall'hash? So che probabilmente non ne ho bisogno, dal momento che la funzione crypt () lo farà internamente quando fa un confronto. Ma solo per il gusto di farlo. Solo per me vedere il sale. Ad esempio, considera questo codice

    $pass = 'secret'; $salt = '$2y$07$usesomesillystringforsalt$'; echo crypt($pass, $salt);
    L'output di questo è $2y$07$usesomesillystringforex.u2VJUMLRWaJNuw0Hu2FvCEimdeYVO e non sono sicuro del limite tra il sale e l'hash. La 'e' nella sottostringa 'forex' parte del sale o dell'hash? Sarebbe molto più semplice se potessi semplicemente estrarre la parte salata di esso.

  3. Anche il manuale di crypt () dice

    ... Blowfish hashing with a salt as follows: "$2a$", "$2x$" or "$2y$", a two digit cost parameter, "$", and 22 characters from the alphabet "./0-9A-Za-z"....

    In base a ciò, prevedo 22 caratteri dopo il segno $ che segue il parametro di costo. Ma considera questo codice

    $pass = 'secret'; $salt = '$2y$07$somesillystring$'; echo crypt($pass, $salt);
    L'output di questo è $2y$07$somesillystring$$$$$$.O6JLPmGlDvy4BicGmkuBD.DN8OYiIoG . La mia domanda è perché è riempito solo fino a 21 caratteri seguendo il segno $ dopo il parametro di costo. Mi aspettavo che fosse riempito fino a 22 caratteri.

posta user1720897 12.03.2014 - 09:26
fonte

1 risposta

3

I 22 caratteri richiesti sono in realtà dati binari codificati che vengono utilizzati per il sale. Bcrypt / Blowfish / $ 2y $ utilizza solo i primi 128 bit dei tuoi 132 bit, quindi gli ultimi quattro bit sono completamente ignorati e non dovrebbero essere un segno di dollaro perché non è un carattere valido per la codifica Base64 modificata che viene utilizzata per sale. Quello che è successo è che hai specificato un valore troppo basso, quindi è stato riempito con $ in modo che il sistema sappia che il sale è terminato. Il motivo per cui è un . è perché, poiché vengono utilizzati solo i primi quattro bit, gli ultimi quattro vengono riempiti con zero prima dell'inizio dell'hash codificato. Un . è tutti zero in questa codifica di tipo base64 e poiché non c'è un valore precedente che influisce sui primi quattro bit del 22 ° carattere, si finisce con solo . . Per inciso, mi chiedo perché hanno scelto di usare dollari anziché . per rappresentare il sale mancante - forse solo per distinguere tra chiedere effettivamente zeri nel sale e la decisione automatica di riempire con loro .

$pass = 'secret';
echo crypt($pass, '$2y$07$notlongenough'), "\n";
echo crypt($pass, '$2y$07$longenoughsortof......');

> $2y$07$notlongenough$$$$$$$$.uYiNG9WczQSWgnuPdcNj0jugGbSnaAC
> $2y$07$longenoughsortof......9dPQFbAgDCQ4RWEcZ4/ficmGapMNSpC

Ha senso solo fornire uno dei seguenti: . , O , e o u per l'ultimo carattere del sale perché questi sono gli unici caratteri nel set di codifica che effettivamente influenzano il primo quattro bit. Per tua informazione, l'intero intervallo è [./A-Za-z0-9] in questo ordine, quindi se li numeri 0-63 e guardi l'espressione binaria di quei numeri vedrai da dove vengono questi quattro caratteri.

Gli esempi sembrano utilizzare erroneamente dollari finali. Non sono necessari e in realtà non dovrebbero essere presenti. Tutto quello che devi fare è fornire abbastanza bit per il sale a seconda dell'algoritmo che stai utilizzando. Ogni personaggio dovrebbe essere il più casuale possibile fino a quando non sono stati forniti abbastanza bit (cioè un minimo di 22 caratteri per Blowfish / $ 2y $).

L'output è quindi una concatenazione di: algo-description, sale usato e risultato hash / password. L'algoritmo conosce i limiti binari di dove termina il sale e inizia la stringa con hash. Non ci dovrebbero essere segni del dollaro con $ 2y $ perché dovresti aver fornito una stringa salt abbastanza lunga che non consisterà in alcun segno di dollaro (anche in questo caso, perché non è nell'intervallo di caratteri valido per la codifica base64 modificata modificata). / p>

Questo dovrebbe essere abbastanza informazioni per poter estrarre il sale se lo desideri. Ma PHP in realtà raccomanda l'uso di password_hash , come faccio io se hai v > = 5.5.0 link .

Questo genererà automaticamente un sale casuale sicuro per te usando /dev/urandom o CryptGenRandom() su Windows - entrambi ben controllati per essere sufficienti per questo scopo. Se hai già iniziato a utilizzare crypt , password_hash è compatibile, quindi non temere l'aggiornamento per utilizzarlo.

    
risposta data 12.03.2014 - 10:28
fonte

Leggi altre domande sui tag