5

モデル フィールドの一部を暗号化するために attr_encrypted を使用しています。全文検索には、Tire と Elasticsearch を使用しています。私は単純な検索フォームを使用しています。ここに私のモデルの一部があります:

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

たとえば、データベースに「John」という名前がある場合、「John」を検索すると、データベースにクエリを実行する前にクエリが暗号化され (Student.encrypt_name(params[:search]))、結果が返されます。 . Elasticsearch ではワイルドカード検索が可能です。たとえば、"Joh*" を検索すると、一致した結果が返されますが、暗号化されたキーワード "Joh" は暗号化された "John" とは異なり、db は結果を返しません。これに関する解決策をいただければ幸いです。

よろしく、 ラドスラフ

4

2 に答える 2

2

簡単な回答 - 全文検索とクライアント暗号化は、現在の最先端技術では相互に排他的です。

より長い答え:

  1. さらに、名前のサウンドデックスにクリアテキストを保存して、比較することができます。これには、機能とセキュリティの両方で妥協が必要です。それが何であるかを確認し、自分で判断してください。

  2. 暗号化された名前のすべての可能な部分一致 (または少なくともこれらの適切なサブセット) を別のテーブルに格納し、ID で一致させます (暗号化されたデータで可能)。私には行きませんが、冒険したい場合は、「データハッシュ」と「逆インデックス」をグーグルで検索できます. これもセキュリティを損なうことに注意してください。

  3. 理論的な結果はありますが、実装に近いものは見つかりませんでした。

于 2012-12-11T11:43:06.513 に答える