2012-06-24 7 views
8

sto lavorando con le rotaie e ho notato che la mia password_digest è diversa per 2 utenti con tutti gli altri campi diversi da quello della password. ma ho usato la stessa password "ABCD" sia per ..
ha finito per generare questi 2 differenti hashperché l'hash della password è diverso per 2 utenti con la stessa password?

  1. $2a$10$QyrjMQfjgGIb4ymtdKQXI.WObnWK0/CzR6yfb6tlGJy0CsVWY0GzO
  2. $2a$10$dQSPyeQmZCzVUOXQ3rGtZONX6pwvnKSBRmsLnq1t1CsvdOTAMQlem

ho pensato che il gioiello bcrypt genera l'hash solo in base al campo password! ho sbagliato? grazie :)

+0

Forse (si spera) la password è [salted] (http://en.wikipedia.org/wiki/Salt_ (crittografia))? –

+0

[Salting!] (Http://en.wikipedia.org/wiki/Salt_%28cryptography%29) –

+0

Questo comportamento è _emphatically_ di progettazione. – SLaks

risposta

16

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.

+1

grazie! :) è stato davvero utile e molto più di quello che mi aspettavo! – viswa

2

bcrypt memorizza il sale nell'hash della password.

Questi sono due diversi hash della stessa password con due diversi sali.

Durante la verifica delle password, bcrypt leggerà il salt dal campo dell'hash, quindi ricalcolo l'hash utilizzando quel salt.