Hashowanie danych i porównywanie w bazie

0

Witam

Mam mały problem do rozkminienia.
Dostaję na wejściu string, który sobie solę i hashuje, a następnie zapisuję go do bazy MS SQL.

Z każdym requestem muszę ten string zahashować i porównać czy już istnieje w bazie.
Dodam, że nie mam na wejściu żadnych innych danych, które jednoznacznie mogą zidentyfikować mi gdzie może siedzieć w bazie rekord z którego mam wyciągnąć hash do porównania.

Bez sensu wyciągać jest wszystkie rekordy, pobierać sól z zapisanego hasha, hashować to co jest na wejściu, solić i porównywać.

Jest jakiś wydajny i mądry sposób na takie zagadnienie?
Zapisywać ten hash jednocześnie w jakiejś szybkiej bazie NoSQL? Tak czy inaczej będzie trzeba też czesać wszystkie rekordy.

1

Jest jakiś ważny powód dla którego solisz każdy z tych rekordów? Zakładam, że to nie są hasła bo nie są związane z użytkownikiem.
Może lepszym podejściem będzie użycie mocniejszego algorytmu np. argon2 i zamiast soli użyć pieprz - wartość zapisaną w konfiguracji czy jakimś "secret manager" . Wtedy będziesz mógł sobie zrobić indeks na tej wartości.

Edit: oczywiście miałem na myśli indeks na kolumnie z haszem.

0

@chalwa: Możesz polecić jakiś "secret manager" dla .NET Core 5 ?

0

Azure ma takie usługi.
On prem nigdy nie stosowałem, bo nie miałem takiej potrzeby.

0

@chalwa: W bazie przechowywać same hashe bez pieprzu?
Następnie przy porównaniu dodawać do jednego i drugiego pieprz?
Czy jak?

0

Miałem na myśli haszowanie z pieprzem i trzymanie tego w bazie. Pieprz trzymasz poza bazą, w innym miejscu.
Jak dostajesz nowy string haszujesz z pieprzem i wyszukujesz wystąpienie w bazie.

Tak jak mówiłem, to jest tylko moja propozycja. Nie mam pojęcia do czego tego używasz. Co jeśli ta baza wpadnie w niepowołane ręce? Czy będziesz to musiał zgłaszać do RODO, czy będziesz mieć z tego tytułu jakieś straty finansowe? Czy po prostu nie chcesz mieć kolizji w haszach? Nie wiem.

0

Trzymałbym hash w DB (Coś prostego typu Key, Value zapewne wystarczy). Ale wprowadziłbym dodatkową warstwę cache (in-memory). Wszystko zależy jakie obciążenie masz ile będzie tych hashy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1