5

Używam attr_encrypted do szyfrowania niektórych pól modelu, a do wyszukiwania pełnotekstowego używam Tire z Elasticsearch. Używam tylko prostego formularza wyszukiwania. tutaj jest częścią mojego modeluJak mogę wykonać wyszukiwanie wieloznaczne na zaszyfrowanych elementach w bazie danych

class Student < ActiveRecord::Base 

    include Tire::Model::Search 
    include Tire::Model::Callbacks 

    attr_accessible :name, :surname 
    attr_encrypted :name,    :key => 'f98gd9regre9gr9gre9gerh' 
    attr_encrypted :surname,   :key => 'f98gd9regre9gr9gre9gerh' 

    def self.search(params) 
    tire.search(load: true) do 
     query { string Student.encrypt_name(params[:search]) } if params[:search].present? 
    end 
    end 
end 

Tak więc, na przykład, jeśli mam imię „Jan” w bazie danych, kiedy wyszukiwania dla „John” kwerenda jest szyfrowane (Student.encrypt_name (params [ : search])) przed wysłaniem zapytania do bazy danych, a wynik zostanie zwrócony. Elasticsearch pozwala na wyszukiwanie wieloznaczne, na przykład jeśli wyszukuję "Joh *", powinien zwrócić dopasowany wynik, ale zaszyfrowane słowo kluczowe "Joh" różni się od zaszyfrowanego "John", a db nie zwraca żadnego wyniku. Wszelkie rozwiązania w tym zakresie byłyby doceniane.

Pozdrawiam, Radoslav

+0

Czy znalazłeś rozwiązanie problemu? mam ten sam problem –

Odpowiedz

2

Krótka odpowiedź - wyszukiwanie pełnotekstowe i szyfrowania klient wykluczają się wzajemnie przy obecnym stanie techniki.

Dłuższe odpowiedzi:

  1. Można dodatkowo przechowywać w czystym tekście soundex nazwy i porównać przez nią. Wymaga to kompromisu zarówno pod względem funkcjonalności, jak i bezpieczeństwa. Sprawdź, co to jest i osądź sam.

  2. Przechowuj wszystkie możliwe częściowe dopasowania (lub przynajmniej niektóre ich części) zaszyfrowane w oddzielnej tabeli i dopasuj według tożsamości (możliwe z zaszyfrowanymi danymi). Nie idź po mnie, ale możesz wyszukiwać hasła "hashing danych" i "index inverse", jeśli czujesz się na siłach. Zauważ, że to także szkodzi bezpieczeństwu.

  3. Są teoretyczne: results, ale nie znalazłem niczego zbliżonego do wdrożenia.

0

Inną opcją, jeśli twoje dane są stosunkowo małe, jest buforowanie danych w pamięci serwera i wykonywanie operacji dopasowywania wyrażenia regularnego w buforowanym zbiorze danych. To może mieć sens, jeśli:

  1. masz ~ 1000 uczniów w szkole
  2. klucz cache jest taka, że ​​dana szkoła może szukać tylko w swoich studentów
  3. buforować minimalny zestaw pól potrzeba do wyszukiwanie bez serializacji całego obiektu

Oczywiście haker może wtedy uzyskać dostęp do pamięci serwera i odczytać dane. Można to częściowo złagodzić dzięki dobrze zaprojektowanej zasadzie spłukiwania pamięci podręcznej.

Powiązane problemy