Czasami zastanawiam się intensywnie nad sensownością szyfrowania danych, nawet jeśli klucz użyty do szyfrowania tych danych jest potencjalnie łatwy do ustalenia (czyli właściwie bardziej obfuskacja niż szyfrowanie). Już wyjaśniam o co mi chodzi.
Załóżmy, że tworzę serwis podobny w koncepcji do Pastebin. Nie ma on służyć do przekazywania szczególnie istotnych danych, ale chciałbym ograniczyć prawdopodobieństwo masowego ich ujawnienia. Załóżmy, że:
- w bazie danych przechowywana jest tylko "metryczka" wklejki,
- same wklejki przechowywane są jako pliki na dysku,
Nagle okazuje się, że z jakiegoś powodu mamy do czynienia z klasycznym głębokim ukryciem i wszystkie pliki zawierające wklejki stają się publicznie dostępne...
Załóżmy teraz, że każdy z tych plików jest szyfrowany, a klucz szyfrowania jest generowany np. w oparciu o:
- identyfikator pliku,
- losowy salt przechowywany w metryczce pliku,
- sekret zawarty w (konfiguracji) aplikacji,
Jeśli ktoś przejmie pełną kontrolę nad serwerem, będzie on oczywiście w stanie odszyfrować każdy plik, jeśli jednak mamy do czynienia wyłącznie z "głębokim ukryciem", to jego szczęśliwi odkrywcy nie bardzo będą mieli się czym chwalić.
Zastanawiam się też nad podobnym podejściem w przypadku części danych przechowywanych w bazach SQL. Wówczas klucz mógłby być unikalny dla użytkownika, ładowany przy jego uwierzytelnieniu i wykorzystywany przy odczycie/zapisie pewnych danych. Mogłoby to chronić do pewnego stopnia przed skutkami SQLi czy błędami kontroli dostępu - atakujący nie otrzymałby danych innego użytkownika, ponieważ nie dysponowałby odpowiednim kluczem. Co więcej, jeśli byłby wykorzystany tryb szyfrowania z kontrolą integralności (authenticated encryption), w bonusie dostalibyśmy wykrywanie próby dostępu do cudzych danych.
Tu warto też wspomnieć o szyfrowaniu homomorficznym, ale to już trochę wyższa szkoła jazdy.
Czy planujesz przeprowadzić jakieś głębsze badania?
Bo byłbym bardzo ciekawy