Spring Security, wykorzystanie hasła jako klucz

0

Cześć

Tworzę aplikacje webową, która w założeniu ma być odporna na różne ataki i podatności, które są uwzględnione w liście TOP10 OWASP. W tym momencie walczę z "Sensitive Data Exposure". W celu prewencji, planuję zaszyfrować takie dane jak hasło użytkownika i jego numer konta. 

O ile z pomocą frameworka Spring Security i algorytmu Bcrypt z hasłem poszło szybko, przyjemnie i bezproblemowo, o tyle z numerem konta jest inaczej. Problem wynika z tego, że chcę aby był on wyświetlany w panelu zalogowanego użytkownika. Funkcja więc nie może być jednokierunkowa, gdyż muszę ją przy wyświetleniu odszyfrować. 

W celu zaszyfrowania numeru konta wymyśliłem że użyję algorytmu AES, gdzie kluczem będzie hasło(w formie jawnej) użytkownika. Jednak hasło w aplikacji jest przechowywane jako szyfrogram. 

Powstaje więc pytanie, czy jest jakaś możliwość przechwycenia i użycia do odszyfrowania numeru konta, wartości hasła wpisywanej w formularzu logowania zanim zostanie przekształcona w szyfrogram? Wykorzystuję panel logowania udostępniony przez Spring Security. 

Może macie jakieś inne pomysły na zaszyfrowanie numeru konta, lub lepszy pomysł na klucz do algorytmu?

Dziękuję za pomoc i zapraszam do dyskusji. 

0

Re-używanie hasła użytkownika to słaby pomysł - chyba, że nie przewidujesz możliwości zapomnienia i resetu hasła.

Rozwiązania, które znam sprowadzają się do tego, żeby haseł używanych do szyfrowania nie trzymać razem z zaszyfrowanymi danymi (a jak się chce mieć inne hasło dla każdego usera to trzyma się hasła, ale znów zaszyfrowane mocnym algorytmem i klucze do tego algorytmu trzyma się gdzie indziej...)

1

generalnie chcesz się bronić przed tym że w razie gdy ktoś shakuje Ci serwer to wszyscy użytkownicy nie będą narażeni, ale generalnie nie jesteś w stanie się w 100% zabezpieczyć przed wyciągnięciem danych jednego użytkownika jeśli ktoś się mocno uprze (chyba że Ty też nie będziesz w stanie ich odszyfrować).

Przykładowo możesz zrobić tak:

  • do szyfrowania danych użyj AES-128 albo AES-256, używać trybu CBC, IV możesz albo ustawić na same 0 albo możesz np wygenerować i trzymać w bazie
  • wygeneruj losowy ciąg bajtów i schowaj go w bazie - nie jest to klucz!
  • jako klucza do AES użyj np. PBKDF2(losowe_bajty, SHA256(haslo)) - SHA256 możesz przyciąć jak będzie za długie (możesz też użyć inny algorytm, poczytaj o key derivation) - parametry do Twojego algorytmu (np liczba rund) zapisz w bazie. Zamiast hasla mozesz uzyc czegokolwiek czego nie trzymasz kolo losowych bajtow

najbezpieczniejszą opcją jest taki zestaw* (tylko uzytkownik jest w stanie odszyfrowac - nawet Ty nie jestes w stanie):

  • użytkownik ma klucz prywatny u siebie na komputerze
  • ty w bazie trzymasz klucz publiczny
  • dane wysylane sa do uzytkownika w postaci zaszyfrowanej
  • uzytkownik szyfruje dane i wysyla Ci dane i haslo zaszyfrowane za pomocą klucza publicznego (z podkreśleniem na publiczny) - tylko osoba z kluczem prywatnym jest w stanie takie haslo odszyfrowac (czyli uzytkownik)

* zakładając że nie masz problemów z XSS na stronie, ale wtedy chyba już nic nie pomoże

generalnie taki format jest opisany w standardzie CMS [Cryptographic Message Syntax] (nie znam API to javy, ale zakładam że ma gdzieś coś takiego). Używaj tylko z AES w kombinacji z RSA lub ECC

0

A może ma ktoś jakiś inny pomysł jak zaszyfrować tę daną na bazie? Może jakieś sprytne przechowywanie kluczy?
Zależy mi na tym, aby użytkownik po wpisaniu hasła od razu mógł zobaczyć odszyfrowaną wartość numeru konta bankowego, nie musiał wpisywać dodatkowych haseł, które musiałby zapamiętać.

0

@panda08690:

A gdyby rozdzielić login do konta i numer konta bankowego?

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