Oczywiście nie należy ich oglądać, dlatego ich wyszukiwanie byłoby problematyczne.
Jedną sztuczką, której użyłem w przeszłości, jest mieszanie zaszyfrowanych danych przed ich zaszyfrowaniem i przechowywanie skrótu w indeksowanej kolumnie. Oczywiście działa to tylko wtedy, gdy szukasz całej wartości; wartości częściowe nie będą miały tego samego skrótu.
Prawdopodobnie możesz to rozszerzyć, tworząc indeks skrótów „pełnego tekstu”, jeśli zajdzie taka potrzeba, ale może się to bardzo szybko skomplikować.
UZUPEŁNIENIE
Sugeruje się dodanie przypisu do mojej odpowiedzi podczas dość długiej debaty na czacie na temat podatności na ataki słownikowe, dlatego omówię potencjalne zagrożenie bezpieczeństwa dla powyższego podejścia.
Atak słownikowy: Atak słownikowy ma miejsce, gdy ktoś wstępnie hashuje listę znanych wartości i porównuje skróty z kolumną haszowaną w bazie danych. Jeśli uda im się znaleźć dopasowanie, prawdopodobne jest, że znana wartość jest faktycznie tym, co jest haszowane (Nie jest to jednak jednoznaczne, ponieważ skróty nie są gwarantowane jako unikalne). Zazwyczaj jest to łagodzone przez haszowanie wartości z dołączoną lub dodaną losową „solą”, aby skrót nie pasował do słownika, ale powyższa odpowiedź nie może użyć soli, ponieważ utracisz możliwość wyszukiwania.
Ten atak jest niebezpieczny w przypadku takich haseł: jeśli utworzysz słownik popularnych skrótów haseł, możesz szybko przeszukać tabelę pod kątem tej wartości skrótu i zidentyfikować użytkownika, który ma takie hasło, i skutecznie wyodrębnić dane uwierzytelniające w celu kradzieży tożsamości tego użytkownika .
Jest mniej niebezpieczny dla przedmiotów o wysokim stopniu liczności, takich jak numery SSN, numery kart kredytowych, identyfikatory GUID itp. (Ale istnieją różne rodzaje ryzyka związane z ich przechowywaniem, więc nie jestem skłonny doradzać w sprawie ich przechowywania ).
Powodem tego jest, aby atak słownikowy zadziałał, musisz mieć wstępnie zbudowany słownik możliwych wartości i ich skrótów. Teoretycznie możesz zbudować słownik wszystkich możliwych SSN (miliard wierszy, zakładając, że wszystkie permutacje formatowania zostaną usunięte; kilkadziesiąt bilionów wpisów dla kart kredytowych) ... ale to zwykle nie jest celem ataku słownikowego i w zasadzie staje się porównywalny z atakiem brutalnej siły, w którym systematycznie badasz każdą wartość.
Możesz także poszukać określonego numeru SSN lub numeru karty kredytowej, jeśli próbujesz dopasować SSN do konkretnej osoby. Ponownie, zwykle nie jest to cel ataku słownikowego, ale możliwe do zrobienia, więc jeśli jest to ryzyko, którego należy unikać, moja odpowiedź nie jest dla ciebie dobrym rozwiązaniem.
Więc masz to. Podobnie jak w przypadku wszystkich zaszyfrowanych danych, zwykle są one szyfrowane z jakiegoś powodu, więc bądź świadomy swoich danych i tego, przed czym chcesz je chronić.
Możesz rzucić okiem na CryptDB . Jest to interfejs dla MySQL i PostgreSQL, który umożliwia przejrzyste przechowywanie i wyszukiwanie zaszyfrowanych danych. Działa poprzez szyfrowanie i deszyfrowanie danych przesyłanych między aplikacją a bazą danych, przepisując zapytania w celu działania na zaszyfrowanych danych. oraz dynamicznie dostosowując tryb szyfrowania każdej kolumny, aby wyświetlać tylko tyle informacji, ile jest potrzebne do zapytań używanych przez aplikację.
Różne metody szyfrowania stosowane przez CryptDB obejmują:
RND , w pełni bezpieczny schemat szyfrowania IND-CPA, który nie przecieka żadnych informacji o danych (z wyjątkiem ich obecności i, w przypadku typów o zmiennej długości, długości), ale umożliwia jedynie przechowywanie i pobieranie, bez zapytań.
DET , wariant RND, który jest deterministyczny, dzięki czemu dwie identyczne wartości (w tej samej kolumnie) są szyfrowane do tego samego tekstu zaszyfrowanego. Obsługuje zapytania dotyczące równości formularza
WHERE column = 'constant'
.OPE , schemat szyfrowania zachowujący porządek, który obsługuje zapytania o nierówności, takie jak
WHERE column > 'constant'
.HOM , częściowo homomorficzny schemat szyfrowania (Paillier), który umożliwia dodawanie zaszyfrowanych wartości razem przez pomnożenie tekstów zaszyfrowanych. Obsługuje
SUM()
zapytania, dodawanie i zwiększanie.SZUKAJ , schemat, który obsługuje wyszukiwanie słów kluczowych w formularzu
WHERE column LIKE '% word %'
.JOIN i OPE-JOIN , warianty DET i OPE, które umożliwiają porównywanie wartości w różnych kolumnach. Obsługuje odpowiednio połączenia równości i zasięgu.
Prawdziwą mocą CryptDB jest to, że dynamicznie dostosowuje metodę szyfrowania każdej kolumny do zapytań, które widzi, dzięki czemu wolniejsze i / lub mniej bezpieczne schematy są używane tylko dla kolumn, które ich wymagają. Istnieją również różne inne przydatne funkcje, takie jak łączenie kluczy szyfrujących z hasłami użytkowników.
Jeśli jesteś zainteresowany, dobrze jest zapoznać się z dokumentami powiązanymi ze stroną CryptDB, w szczególności „CryptDB: Ochrona poufności za pomocą szyfrowanego przetwarzania zapytań” Popa, Redfield, Zeldovich i Balakrishnan ( SOSP 2011 ). Dokumenty te opisują również bardziej szczegółowo różne kompromisy w zakresie bezpieczeństwa i wydajności związane z obsługą różnych typów zapytań.
źródło
It works by encrypting and decrypting data as it passes between the application and the database
: Z pewnością może to powodować problemy, jeśli wyszukiwane dane są już w bazie danych (zaszyfrowane), ale oczywiście samo zapytanie przeszukujące bazę danych jest następnie przekazywane do CryptDB (a następnie szyfrowane?). Nie rozumiem, jak ta metoda może być w ogóle skuteczna?Nie rozumiem, dlaczego obecne odpowiedzi nie zakwestionowały w pełni wymagań, więc zapytam i zostawię jako odpowiedź.
Jakie są przyczyny biznesowe? Jakie dane potrzebujesz zaszyfrować i dlaczego? Jeśli szukasz zgodności z PCI, mógłbym napisać esej.
Pytania dotyczące twojego wymagania:
Zabezpieczenia RDBMS są zwykle wykonywane na podstawie uprawnień, które są wymuszane przez użytkownika / rolę. Dane są zwykle szyfrowane przez RDBMS na dysku, ale nie w samych danych kolumnowych, ponieważ tak naprawdę nie ma to sensu dla aplikacji zaprojektowanej do wydajnego przechowywania i pobierania danych.
Ogranicz według użytkownika / roli / interfejsu API. Szyfruj na dysku. Jeśli przechowujesz ważniejsze dane, chciałbym wiedzieć, dlaczego używasz MySQL.
źródło
Patrzę na to i natknąłem się na twoje pytanie. Opieram się na podejściu przedstawionym w sekcji 5.4 dokumentu „Praktyczne techniki wyszukiwania w zaszyfrowanych danych” http://www.cs.berkeley.edu/~dawnsong/papers/se.pdf
Podstawowym założeniem jest utworzenie indeksu zawierającego zaszyfrowane słowa kluczowe, które są obecne w zaszyfrowanym dokumencie wyszukiwania. Sztuką jest także szyfrowanie lokalizacji w dokumencie (lub bazie danych), w których obecne są te słowa kluczowe.
źródło
Programowo skutecznym rozwiązaniem jest
Chodzi o to, że 1 i 4 są znacznie mniejszymi zestawami danych niż pobieranie i deszyfrowanie wszystkich pól wszystkich rekordów na początku.
Mam nadzieję, że to pomaga.
źródło
temp/
folder i wybijają, wartości tekstu jawnego dla całej kolumny są dostępne, nie jest to bezpieczny sposób działaniaJest to możliwe dzięki pełnej funkcjonalności wyszukiwania przy użyciu wewnętrznych funkcji szyfrowania MYSQL.
Oto przykład:
!!! UŻYWAM KODU MYSQL () TUTAJ DLA PROSTOŚCI, MYSQL_ENCODE JEST TERAZ UWAŻANY ZA BEZPIECZEŃSTWO, NALEŻY UŻYWAĆ JEDNEGO Z INNYCH WEWNĘTRZNYCH FUNKCJI MYSQL !!!
Jak sugeruje powyższy komentarz, NIE używaj ENCODE (), używaj jednej z innych funkcji szyfrowania Używam tylko ENCODE w tym przykładzie ze względu na jego prostotę
Jeśli robisz to w aplikacji, takiej jak php, możesz to zrobić w ramach bramy db lub klas repozytorium, przechowując listę / tablicę zaszyfrowanych kolumn każdej tabeli w odpowiedniej klasie bramy.
Oczywiście jest to bardzo szorstki i niepewny kod, którego nie należy używać w produkcji bez znaczącej poprawy. Ale powinien służyć swojemu celowi w przedstawieniu ogólnego pomysłu.
źródło
Zakładając, że szukasz w SQL i przy pełnej wartości, a nie częściowej (np. LIKE „wartość%”) ... podczas przechwytywania danych wyszukiwania, zaszyfruj te dane przy użyciu tego samego algorytmu, który był używany, gdy dane zostały zaszyfrowane i poszukaj tego.
Na przykład:
Co by było:
Zamiast tego może wyglądać następująco:
źródło