【问题标题】:Encryption/Decryption on columns of already existing table in SQL Server 2008 with LinqToSql使用 LinqToSql 对 SQL Server 2008 中已有表的列进行加密/解密
【发布时间】:2017-07-15 03:03:34
【问题描述】:

我们的数据库中有一个表,比如 tbl_X。该表在 PROD 中存在相当长的一段时间,大约有 2000 行。行仅偶尔更新一次并插入到该表中。创建此表时,未考虑保护和安全性。但是,此表包含我们认为需要某种程度保护的数据。

我们现在想在保存任何内容之前加密表中某些列的值。我们希望在 UI 上显示之前(或执行任何其他操作之前)解密该值。

所以场景是:

数据库服务器:SQL SERVER 2008

tbl_X 架构:

Id int not null,
Name varchar(100) not null,
CustAccount varchar(100) not null,
CustPrefText varchar(200) not null,
CreatedBy int not null

我们希望对 CustAccount 和 CustPrefText 列进行加密。

我们使用 Linq2SQL 来获取和设置表中的数据。所以我们正在考虑实现上述要求的东西,比如this

public partial class tbl_X
{
    public string CustAccount
    {
        get
        {
            return Crypter.Decrypt(this.CustAccount)
        }
        set
        {
            this.CustAccount= Crypter.Encrypt(value)
        }
   }
}

问题:

  1. 有没有更好的方法来处理更改?
  2. 表中的现有数据在手动更新时是否可能会导致任何问题?
  3. 是否需要更改上述列的数据类型?

提前致谢。如果需要任何其他详细信息,请告诉我。

【问题讨论】:

  • 为什么不用SQL Server自己的加密呢?这回答了#1。对于 #2 - 使用自定义加密可能会导致 较弱 加密。如果没有您的课程,您也无法查询数据。 #3。你的Crypter.Encrypt 返回什么?不是字符串吗?多长时间?
  • 我们正在使用 LinqToSql。如何确保我从表中读取的内容被解密?
  • @PanagiotisKanavos:我们在整个项目中使用了LinqToSql,但是要使用SQL Server自己的加密,我们必须编写Stored procs来读写,这是我们不想要的。你能告诉我一些我可以阅读的材料吗?

标签: asp.net sql-server sql-server-2008 encryption linq-to-sql


【解决方案1】:

AlwaysEncrypted 是您所需要的。它是一种客户端加密技术,可以与 ADO.Net SqlClient 一起使用,因此也可以与 LinqToSql 一起使用。以下是更多详细信息:AlwaysEncrypted client development

但是,您需要 SQL Server 2016 来执行此操作。

【讨论】:

  • 谢谢。但我需要用 SQL Server 2008 来做这件事。有什么建议吗?
  • 我猜你将不得不坚持你所展示的方法。您可能需要根据加密函数返回的内容更改数据类型。由于您似乎只加密 varchar 列,您可能不需要更改数据类型,但不确定大小。
  • 如果我用我的方式,你能建议我在c#端加密/解密的任何函数吗?我想要一个 c# 函数,它的等效函数在 sql 中也可用,这样我可以在需要时通过 SSMS 手动查询表。
  • 恐怕没有这样的库可用,AFAIK。您可以尝试使用在 c# 和 SQL 中具有等效项的标准加密算法。但从哲学上讲,这首先违背了加密的目的。加密的目的是确保没有其他人可以理解数据,即使他们可以进入您的数据库。
猜你喜欢
  • 2013-12-16
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2014-12-03
  • 2011-01-10
  • 2012-03-28
相关资源
最近更新 更多