Spring Security, wykorzystanie hasła jako klucz

Spring Security, wykorzystanie hasła jako klucz
P0
P0
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:6
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...)

P0
panda08690
Czy masz gdzieś może przykład takiego rozwiązania?
KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:5 miesięcy
  • Postów:2514
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


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 5x, ostatnio: krwq
Zobacz pozostałe 4 komentarze
WeiXiao
PBKDF2(losowe_bajty, SHA256(haslo)) a gdzie iteracje?
P0
panda08690
Okej, wydaje mi się że rozumiem tę kwestie. Ale teraz pytanie. Czy przechowywanie obu argumentów funkcji, na bazie, jest bezpieczne? Przecież przy wypłynięciu danych nic nie stoi na przeszkodzie samemu odczytać sobie klucz. Btw. do hashowania hasła używam algorytmu BCrypt, rozumiem, że on się nada?
WeiXiao
@panda08690: hash_function(salt, real_plain_password) = hash. Mając hash i salt (bo to się trzyma w bazie) nie odwrócisz tej funkcji żeby wyciągnąć hasło, więc musisz sprawdzać, a to może być bardzo kosztowne (lata), ale najlepiej gdybyś pytał jakiegoś koxa o te sprawy :)
KR
@WeiXiao - nie chciałem komplikować głównej idei, wspomniałem o tym w poście. @panda08690 tak jak napisałem w poście - nie da się zabezpieczyć przed shakowaniem pojedynczego użytkownika, da się tylko ograniczyć szkody - PBKDF2 jest na tyle wolny że brute force hasła jak i sprawdzanie wszystkich naraz jest upierdliwy. Postaraj się po prostu nie trzymać wszystkich parametrów do PBKDF2 obok siebie w bazie (np hasło czy hash hasła możesz spytać jeszcze raz użytkownika przed operacją na której Ci zależy albo trzymać jakiś inny hash w ciasteczku)
KR
inny hash, czyli to co napisał @WeiXiao, z tym że jako implementacji hash_function użyj HMAC_<HASH FUNC> - np. HMAC_SHA256. (np. przy logowaniu wygenerować ciasteczko z bajtami opartymi na haśle np.: HMAC_SHA256(haslo, nazwa_uzytkownika))
P0
P0
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:6
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ć.

KR
@panda08690 nikt nie powiedział że crypto jest łatwe :P
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 3 godziny
  • Postów:5107
0

@panda08690:

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)