Quello che stai vedendo qui è più che un hash della password, ci sono molti metadati sull'hash incluso in quelle stringhe. In termini di bcrypt, l'intera stringa verrebbe considerata l'hash di bcrypt. Ecco cosa include:
$ è il delimitatore in bcrypt.
Il $ 2a $ è l'algoritmo di bcrypt che è stato utilizzato.
Il $ $ è il fattore di costo utilizzato. Questo è il motivo per cui bcrypt è molto popolare per la memorizzazione degli hash. Ogni hash ha una complessità/costo ad esso associato, che si può pensare a quanto velocemente ci vorrà un computer per generare questo hash. Questo numero è ovviamente relativo alla velocità dei computer, così come i computer diventano sempre più veloci nel corso degli anni ci vorrà sempre meno tempo per generare un hash con il costo di 10. Quindi l'anno prossimo si aumenta il costo a 11, quindi a 12 ... 13 ... e così via. Ciò consente ai tuoi futuri hash di rimanere forti mantenendo i tuoi vecchi hash ancora validi. Basta notare che non è possibile modificare il costo di un hash senza rimodellare la stringa originale.
Il $ QyrjMQf ... è una combinazione di sale e hash. Questa è una stringa codificata in base64.
I primi 22 caratteri sono il sale.
I caratteri rimanenti sono l'hash quando utilizzato con l'algoritmo 2a, il costo di 10 e il sale specificato. Il motivo del sale è che un utente malintenzionato non può pre-calcolare gli hash di bcrypt per evitare di pagare il costo di generarli.
In realtà questa è la risposta alla tua domanda iniziale: La ragione per cui gli hash sono diverse perché se fossero la stessa si sa che ogni volta che ha visto la stringa bcrypt $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
si conosce la password sarebbe abcd
. Quindi puoi semplicemente scansionare un database di hash e trovare rapidamente tutti gli utenti con la password abcd cercando l'hash.
Non è possibile farlo con bcrypt perché $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem
è anche abcd
. E ci sono molti molti molti altri hash che saranno il risultato di bcrypt('abcd')
. Questo rende impossibile la scansione di un database per le password abcd.
Forse (si spera) la password è [salted] (http://en.wikipedia.org/wiki/Salt_ (crittografia))? –
[Salting!] (Http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –
Questo comportamento è _emphatically_ di progettazione. – SLaks