Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何搜索包含50000条加密记录的表_C#_.net_Sql Server_Entity Framework_Linq - Fatal编程技术网

C# 如何搜索包含50000条加密记录的表

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

我有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.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个字段

最好的解决方案是什么(引导我找到代码解决方案),以便能够:

  • 加密数据库上的所有字段,而不使用SQL 2016始终加密
  • 进行搜索
  • 保持性能

  • 在使用中间层解决方案对静态数据进行加密时,您必须做出很多权衡,就像您目前正在做的那样。虽然“始终加密”无疑会使事情变得更简单,并消除应用程序中的自定义加密代码,但自定义加密仍然存在类似的限制,例如无法执行通配符
    之类的
    过滤,因为它们的功能类似,即加密/解密不会在数据库级别发生

    有几项建议:

    基本过滤仍然有效 使用相同的加密密钥&salt时,仍然可以执行正常的
    过滤,其中x='y'
    类型的过滤

    将搜索和筛选转移到中间层

    同样,一个折衷方案&可能会影响性能,但一旦数据被解密,您就可以使用普通的旧LINQ执行更复杂的过滤

    您真的需要加密该列吗?


    您的数据是否未被归类为PHI、PII或其他类似类别?考虑不加密它,你可以执行正常的SQL <代码> < <代码> >代码>类似< /代码>过滤< /p> < p>这些问题可能会导致各种正确的答案。我只想谈谈我会为每个问题做些什么

    1。加密数据库上的所有字段。

    我认为这个问题可以分为两个部分:

    • A部分:将当前数据更新为加密格式。
    这部分是最简单的(但不是最短的),可以通过一个简单的一次性项目来解决,即读取每一行并将其更新为加密格式。此部分可以是可选的,因为您的项目可以区分加密数据和清除数据

    • 第二部分:加密新数据
    这里有两种选择,取决于你想花多少时间来解决第一个问题。最好是更改EF项目中保存数据的方式。最糟糕的情况是在给定时间重新运行项目A部分

    2。进行搜索。

    这里最简单、最安全的方法是加载所有数据并使用Linq请求

    3。保持性能。

    他们的方法很多,这取决于您是来自web项目还是软件项目。我只想谈一谈可能涉及双方的解决办法

    但要当心!如果您不特别注意这一点,下面的每个解决方案都会增加很多安全问题。而实现许多目标需要更多的修补工作

    • 缓存
    最好的通用解决方案之一是使用一些$cache$。它可以使用()直接缓存数据库,也可以使用()缓存EF项目中的数据库

    也许您可以在
    SqlChangeMonitor
    中同时使用这两个选项来更新EF缓存

    • 暗示
    示例:列A、B和C的每个可能值的数据分布均匀。将这些列与索引一起使用,并在每个
    位置使用
    ,应该会给您一个快速的响应

    如何实现:使用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);
            }