5

Ruby on Rails アプリがあり、attr_encryptedgem を使用して一部のユーザー情報を暗号化しています。ソルトと IV があるため、2 方向暗号化されています。gem はクエリを支援するために動的にインターセプトfind_byしますが、結果の数が気になるので、私の場合は十分なクエリではありません。

特定の に一致するすべての結果を返すようにテーブルをクエリする方法はありますsecretか?

これが例です。テーブルがusersあり、暗号化されたsecret属性があります。したがって、テーブルにはencrypted_secretencrypted_secret_iv、およびがありencrypted_secret_saltます。ユーザーが "abd123" のシークレットを指定した場合、テーブルをクエリして、"abc123" をシークレットとして使用した他のユーザーの数を確認するにはどうすればよいですか?

4

1 に答える 1

2

secret_hash暗号化されていないシークレットを追加で保存することもできます。2 つのレコードが同じであるsecret場合、それらも同じになりsecret_hashます。

モデルに次のようなものを追加します。

scope :by_secret, ->(secret) { 
  where(secret_hash: Digest::MD5.hexdigest(secret) 
}

before_save :generate_secret_hash

private 
def generate_secret_hash
  self.secret_hash = Digest::MD5.hexdigest(secret)
end

その後、次のようにクエリできます。

YourModel.by_secret('abd123').count

警告

パスワードやその他の機密情報の MD5 ハッシュを保存すると、セキュリティ上のリスクが生じます。secretからプレーン テキストを判別できない場合でもsecret_hash、ユーザーがいつ同じ を共有するかを判別できますsecret。または、さらに悪いことに、MD5 ハッシュが MD5-reverse-lookup-dictionary で利用できる可能性があります。

このセキュリティ上の問題と、その列に対してクエリを実行できる利点とを慎重にトレードオフする必要があります。

于 2014-11-11T01:40:14.810 に答える