2013-07-18 11 views
5

Używam bcrypt do generowania soli i hash haseł, ale nie sądzę, że robi to bardzo bezpiecznie. Gdy używam następujący kod:Bcrypt nie jest bezpieczny przy haszowaniu haseł?

bcrypt.genSalt(10, function(err, salt) { 
    user.salt = salt; 
    bcrypt.hash(password, salt, function(err, hash) { 
    user.hashed_password = hash; 
    console.log(user.salt); 
    console.log(user.hashed_password); 
    user.save(function(err) { 
     if (err) console.log(err); 
     console.log("saved"); 
    }); 
    }); 
}); 

W jednym przykładzie, sól jest: $2a$10$mFFjRpY1Vrq7Fy1fFp0fMO i hashed_password jest: $2a$10$mFFjRpY1Vrq7Fy1fFp0fMOVnlv9cKgAFdCQ5xdtlP6UoKz90i1FMu

Początek zaszyfrowany hasłem jest dokładnie taka sama jak sól. Jeśli atakujący ma dostęp do soli, czy nie może po prostu usunąć soli z hasha_hasła i albo brutalną siłą, albo użyć tabeli z góry ustalonych wartości hashowych w celu ustalenia hasła?

Zawsze myślałem, to powinna być kolejność mieszania hasło:

hash(salt + password) 

wolno:

salt + hash(password) 

Odpowiedz

17

Początek zaszyfrowany hasłem jest solą bo potrzeba dostęp do sól w celu weryfikacji hasła.

Dane widać nie jest ani krzyżyka (sól + hasło), ani sól + hash (hasła) - to jest postaci

salt + hash(salt + password) 

Jeśli atakująca uzyska dostęp do tych danych, a następnie:

  • Mogą oczywiście (teoretycznie) brutalnie wymuszać hasło - żadna technika nie może temu zapobiec, ale ograniczenie liczby sprawi, że atak będzie niepraktyczny. Funkcja hash używana w tym przypadku jest zaprojektowana tak, aby długo działała, pośrednio ograniczając atak.
  • One nie mogą użyć standardowej tabeli skrótów, aby znaleźć hasło - ponieważ mieszana wartość zawiera również unikalną sól. Oczywiście sól jest tam czysta, więc można obliczyć tabelę, ale ponieważ sól jest również unikalna dla każdego zakodowanego hasła, nie jest to lepsze niż atak brutalnej siły.
Powiązane problemy