C# 如何搜索包含50000条加密记录的表
我有SQL Server 2012,无法迁移到SQL Server 2016 我使用的是加密,首先是实体框架代码C# 如何搜索包含50000条加密记录的表,c#,.net,sql-server,entity-framework,linq,C#,.net,Sql Server,Entity Framework,Linq,我有SQL Server 2012,无法迁移到SQL Server 2016 我使用的是加密,首先是实体框架代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Configuration; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnn
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace x.y.Api.Models
{
[Table("Tbl_Naturalezas")]
public class Naturalezas: EncryptDecrypt
{
public Naturalezas()
{
_locked = true;
}
[Key]
public int idNaturaleza { get; set; }
string _naturaleza;
[StringLength(350)]
public string naturaleza
{
get { return locked ? Decrypt(_naturaleza, ConfigurationManager.AppSettings["appKeyPassword"]) : naturaleza; }
set { _naturaleza = IsEncrypted(value) ? value : Encrypt(value, ConfigurationManager.AppSettings["appKeyPassword"]) ; }
}
public virtual ICollection<Contactos> Contactos { get; set; }
}
}
在POST api控制器中,我执行以下操作:
// POST: api/Naturalezas
[ResponseType(typeof(Naturalezas))]
public IHttpActionResult PostNaturaleza(Naturalezas naturaleza)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
naturaleza.Unlock();
db.Naturalezas.Add(naturaleza);
db.SaveChanges();
naturaleza.Lock();
return CreatedAtRoute("DefaultApi", new { id = naturaleza.idNaturaleza }, naturaleza);
}
我将此加密基于此博客帖子:
现在,这只适用于一个表,但在另一个表中,我们有20个字段,所有字段都必须加密,但是我们需要能够使用诸如,=,等来搜索这20个字段
最好的解决方案是什么(引导我找到代码解决方案),以便能够:
在使用中间层解决方案对静态数据进行加密时,您必须做出很多权衡,就像您目前正在做的那样。虽然“始终加密”无疑会使事情变得更简单,并消除应用程序中的自定义加密代码,但自定义加密仍然存在类似的限制,例如无法执行通配符
之类的
过滤,因为它们的功能类似,即加密/解密不会在数据库级别发生
有几项建议:
基本过滤仍然有效
使用相同的加密密钥&salt时,仍然可以执行正常的过滤,其中x='y'
类型的过滤
将搜索和筛选转移到中间层
同样,一个折衷方案&可能会影响性能,但一旦数据被解密,您就可以使用普通的旧LINQ执行更复杂的过滤
您真的需要加密该列吗?
您的数据是否未被归类为PHI、PII或其他类似类别?考虑不加密它,你可以执行正常的SQL <代码> < <代码> >代码>类似< /代码>过滤< /p> < p>这些问题可能会导致各种正确的答案。我只想谈谈我会为每个问题做些什么 1。加密数据库上的所有字段。 我认为这个问题可以分为两个部分:
- A部分:将当前数据更新为加密格式。
- 第二部分:加密新数据
- 缓存
SqlChangeMonitor
中同时使用这两个选项来更新EF缓存
- 暗示
位置使用,应该会给您一个快速的响应
如何实现:使用Select INDER或只从结果返回表和查询的函数创建一个存储过程。您的EF项目需要重新设计,以便从存储过程的函数/结果集进行查询
- 使用临时数据
在登录/输入时,用户可以使用未加密的数据将所有数据保存在临时索引表中,并在此临时表上进行查询。如果你开发了解决方案1.A,这将很容易。您可以使用保持固定计划
或保持计划
选项以更好地执行。同样,它会要求你重新设计你的EF项目(但这一个应该更简单)
警告:不要使用全局临时表。拥有加密数据将打破这一点。如果数据已加密,而密码不在数据库中,则无法真正执行类似于
的操作。即使使用always encrypted,你也不能像这样做。我发现了这个,但它没有说它是否可以像这样工作。
// POST: api/Naturalezas
[ResponseType(typeof(Naturalezas))]
public IHttpActionResult PostNaturaleza(Naturalezas naturaleza)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
naturaleza.Unlock();
db.Naturalezas.Add(naturaleza);
db.SaveChanges();
naturaleza.Lock();
return CreatedAtRoute("DefaultApi", new { id = naturaleza.idNaturaleza }, naturaleza);
}