2014-01-19 3 views
3

У меня есть приложение rails, которое требует, чтобы я шифровал некоторые столбцы в базе данных.Rails Зашифрованные столбцы, которые все еще разрешают поиск

У меня уже есть, на основе многих примеров, пароль пользователя и почтовый шифр. Это казалось легким даже для нуба, подобного мне.

Конкретная проблема заключается в том, что я разрабатываю приложение для адвокатов (действительно один из них), и я хочу зашифровать их имена и адреса клиентов, чтобы, если база данных была украдена, эти данные не читаются. Проблема в том, что конечный пользователь (адвокат) захочет выполнить поиск по клиенту.

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

На самом деле, я даже уверен, что такое шифрование, которое я ищу, возможно или практично. Я читал немного и искал, но до сих пор я не нашел четких решений. Ниже приведены самые перспективные вещи, на которые я смотрел. Все это кажется мощным и творческим решением. Пожалуйста, помогите мне исправить любые неверные впечатления и указать, если таковые существуют, решения, которые могут работать. Как всегда, спасибо.

attr_encrypted

шифрования приложений, но я не думаю, что практический поиск возможен.

pgcrypto

Позволяет использовать шифрование базы данных PostgreSQL, но это не Rails 4.0, и я не могу сделать так. Не уверен, что он все равно сделает то, что я хочу.

jmazzi/crypt_keeper

Позволяет использовать шифрование базы данных PostgreSQL, но не позволяет для вида поиска в данном клиенте, который будет работать.

+0

Любое решение? Я столкнулся с той же проблемой –

ответ

2

Согласно attr-encrypted/README.rdoc поиск возможен. Существует предупреждение, что он будет работать только в том случае, если все записи зашифрованы одним и тем же ключом для каждого атрибута.

Данный пример является:

class User < ActiveRecord::Base 
    attr_encrypted :email, :key => 'a secret key' 
    attr_encrypted :password, :key => 'some other secret key' 
end 

# You can now lookup and login users like so: 
User.find_by_email_and_password('[email protected]', 'testing') 
+0

Спасибо, Фрэнк. Я смотрю на это снова, но, похоже, не разрешает поиск, кроме как в том смысле, что хеши совпадают. (Я думаю.) Сортировка и «как» поиск кажутся проблематичными, но, возможно, это просто недоразумение с моей стороны. – codenoob

+0

А, да, я не рассматривал нечеткие поиски или сортировку. Кажется, единственный способ получить сортировку для работы - это сделать это в рубине после извлечения всех записей. Самое неудачное. –

+0

Таким образом, приведенная ниже ссылка на вопрос и ответ имеет работоспособное решение для поиска. В основном то, что происходит, это дешифрование каждого значения столбца один за другим и сравнение. Это не так уж плохо, но опять же, я думаю, что это, вероятно, лучше сделать в базе данных.Я полагаю, что проблема сортировки может быть решена с помощью нового столбца, который находится в том же порядке, что и зашифрованные столбцы, но это плохая работа. – codenoob

1

encrypt_column камень имеет для поиска вариант, который использует хэш для поиска и добавляет метод with_ к классу.

+0

Я посмотрю на это Дэн, и я намного выше своего весового класса, но я больше не думаю, что решение действительно возможно, даже теоретически. Чтобы быть действительно безопасным, как мне кажется, теперь мы знаем, что колонка должна быть соленая, а затем зашифрована. У вас должна быть отдельная соль для каждого значения. Учитывая эти ограничения, я не понимаю, как у вас может быть «нечеткий» поиск (LIKE в SQL), не говоря уже о прямолинейном поиске. – codenoob

+0

Он не использует нечеткий поиск. Что он делает, так это хранить хэш-поле в db для зашифрованного открытого текста на основе указанной соли (наряду с зашифрованным зашифрованным текстом в отдельном столбце db). Затем метод поиска принимает открытый текст, хэширует его с помощью соли и ищет значение, используя это хешированное значение. –

+0

Спасибо Dan. Таким образом, «подобный» SQL-запрос не может работать. (Это то, что я имел в виду под «нечетким».) – codenoob

Смежные вопросы