BCrypt.Net Verify zawsze zwraca false

0

Mam problem z biblioteką bcrypt. Używam hashowania hasła po stronie Angulara i przekazuję hash do backendu w .Net Core, żeby sprawdzić czy wprowadzony hash jest zgodny z tym co siedzi w bazie. Na froncie używam bcryptjs, na backendzie BCrypt.Net. Gdy sprawdzam hashe metodą .Verify(), metoda zawsze zwraca false. Próbowałem nawet zamockować dane w postaci dwóch zmiennych, do których wpisałem identycznego stringa i użyłem metody .HashPassword(). Metoda .Verify() nawet na tych danych zwróciła wartość false.
Czy ktoś wie w czym jest problem? Wygląda na to, że niepoprawnie używam BCrypt na backendzie, ale nie wiem dlaczego nawet przy zamockowanych danych Verify zwraca false.

Kawałek kodu, który sprawdza te hashe:
Backend:

//Dane zamockowane
string pass1 = "test1234";
string pass2 = "test1234";

var p1 = BCrypt.Net.BCrypt.HashPassword(pass1);
var p2 = BCrypt.Net.BCrypt.HashPassword(pass2);

var ret = BCrypt.Net.BCrypt.Verify(p1, p2);

//Dane właściwe do sprawdzenia
string passwordHashFromDb = _userRepository.GetPasswordHashByUserEmail(email);
return BCrypt.Net.BCrypt.Verify(passwordHash, passwordHashFromDb);

Front:

const salt = bcrypt.genSaltSync();
var passwordHash = bcrypt.hashSync(this.loginFormModel.value.Password as string, salt);

const params = new HttpParams()
  .set('email', this.loginFormModel.value.Email as string)
  .set('passwordHash', passwordHash);
  
return this.client.get(this.baseUrl + ApiPaths.SignIn, {params});
3

Jaki ma cel hashowanie hasła na froncie? Tak się normalnie nie robi.

2

Verify sprawdza plain z hashem, a nie porównuje dwa hashe.

4

Może przeczytaj readme, dowiesz się do czego służy Verify, na pewno nie do porównywania dwóch hashy.

https://github.com/BcryptNet/bcrypt.net/blob/main/src/BCrypt.Net/BCrypt.cs

1

Opisze trochę szerzej dlaczego haszowanie hasła na froncie jest bez sensu.

Po co hasuje się hasła w bazie?
Tutaj moim zdaniem są dwa powody jedno to włamanie do bazy bez włamania się do serwer backendowego w ten sposób hasła od ludzi dalej nie są znane i chociaż włamywacz ma wszystkie dane to nie uzyska dostępu do innych serwisów (ludzie często używają tego samego hasła). Drugi powód to by ludzi mających dostęp do bazy a nie zawsze to są sami programiści zwyczajnie nie kusiło.

Dlaczego hasowanie w sposób jaki ty robisz mija się kompletnie z celem?

Ponieważ wydaj ci się, że algorytm haszujący zawsze robi to tak samo i można go przez dowolny program rozszyfrować oczywiście można tak zahashować ale po co takie szyfrowania?

Dlaczego nie działa?

Ponieważ na froncie bcrypt.genSaltSync(); generuje losowy string za pomocą ,którego hasło się haszuje bez przekazania go na backend go nie odszyfrujesz ale jeśli go przekażesz to wracamy po co szyfrować skoro każdy to odczyta?

Dlaczego nie szyfrujemyna frontendzie?
Ponieważ protokół https zapewnia sam w sobie szyfrowanie a jakiekolwiek szyfrowanie na frontendzie (upraszczam) nie ma sensu.

0
Botek napisał(a):

Opisze trochę szerzej dlaczego haszowanie hasła na froncie jest bez sensu.

Po co hasuje się hasła w bazie?
Tutaj moim zdaniem są dwa powody jedno to włamanie do bazy bez włamania się do serwer backendowego w ten sposób hasła od ludzi dalej nie są znane i chociaż włamywacz ma wszystkie dane to nie uzyska dostępu do innych serwisów (ludzie często używają tego samego hasła). Drugi powód to by ludzi mających dostęp do bazy a nie zawsze to są sami programiści zwyczajnie nie kusiło.

No nie do końca; nawet z zaszyfrowanymi hasłami można znaleźć czyjeś hasło, jeśli masz dużą bazę użytkowników. Dla przykładu, chcemy znaleźć który użytkownik ma hasło password123. Robimy z niego Sha1(), i wystarczy wtedy zwykył SELECT username FROM users WHERE password = :sha1.

Możesz próbować dodać sól, ale to tylko wydłuży robienie select'a, hasło nadal znajdziesz.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.