Шифровать и дешифровать индексные поля в RavenDB - PullRequest
3 голосов
/ 10 февраля 2012

Мое приложение требует, чтобы мы шифровали поля индекса. Прямо сейчас шифрование / дешифрование обрабатывается на уровне приложения. Я хочу отодвинуть процесс шифрования от уровня приложения, чтобы мне не приходилось вручную шифровать данные в модели или в запросе.

Я хочу украсить модель атрибутами, чтобы определить, должно ли поле быть зашифровано или нет. Я смотрел на использование IDocumentConversionListener для обработки преобразования в и из документа. Это лучшее место, чтобы справиться с этим? Если это так, как мне шифровать / дешифровать только поля с атрибутами в сложной модели? Ниже приведен пример модели с двумя полями, которые необходимо зашифровать.

    public class User
    {
        public string Id { get; set; }
        [EncryptAttribute]
        public string Name { get; set; }
        public Contact PhoneNumber { get; set; }
        public class Contact
        {
            public string Type { get; set; }
            [EncryptAttribute]
            public string Value { get; set; }
        }
    }

public class SecureFieldListener : IDocumentConversionListener
{
   public void EntityToDocument(object entity, RavenJObject document, RavenJObject metadata)
   {

   }
   public void DocumentToEntity(object entity, RavenJObject document, RavenJObject metadata)
   {

   }
}

1 Ответ

2 голосов
/ 11 февраля 2012

Что касается того, как хранить документы в зашифрованном виде, смотрите здесь: http://daniellang.net/document-level-encryption-in-ravendb/

Шифрование индексов на высоком уровне (выше lucene) имеет много серьезных проблем, и я уверен, что вы не хотите этого делать. Запросы диапазона не будут работать, порядок будет нарушен, полнотекстовый поиск невозможен и т. Д.

Обратите внимание, что по умолчанию ворон хранит поля внутри люцена без хранения полей. Это означает, что, хотя вы можете использовать их в запросах, вы не можете получить их значение обратно в качестве результата поиска. Тем не менее, я понимаю, что в очень безопасных средах этого может быть недостаточно, поскольку их можно извлечь каким-то образом .

Так что, если вам действительно нужен такой высокий уровень безопасности, я предлагаю вам выбрать один из следующих вариантов:

  • Не использовать индексы
  • Шифрование папки индекса на сервере ravens на уровне файловой системы (например, с использованием TrueCrypt)
  • Расширьте RavenDB, чтобы она использовала собственную реализацию FSDirectory lucene, которая использует симметричный алгоритм для всех дисковых операций ввода-вывода
...