【问题标题】:How do I encrypt SQL Server data in application level and still be able to query it with LIKE?如何在应用程序级别加密 SQL Server 数据并且仍然能够使用 LIKE 查询它?
【发布时间】:2015-10-02 09:40:21
【问题描述】:

情况:

  • 我正在使用 Microsoft SQL Server 和 C# .NET 为我的组织开发一个 ASP.NET 网站。这将是一个 Intranet 网站。
  • MS SQL Server 数据库的某些列中包含敏感数据。大约 6 个表中有大约 320,000 行。这些数据对我来说是绝密的,因为我手动准备了它并将其输入到表格中。任务很乏味,我花了大约一年的时间。也就是说,我不希望任何人获得这些数据的可读副本。
  • 我对 Intranet 服务器没有任何权限。我必须将发布的网站以及数据库数据和架构提供给其他人来托管它。我会保护我的 .NET 代码。
  • 管理数据库服务器的部门工作人员将托管该网站。他们不信任,并且绝不能获得数据的可读副本。他们拥有管理 SQL Server 的完全访问权限和完全权限。
  • 我需要使用 LIKE 查询加密数据。
  • 虽然存储过程最适合我,但我不介意在 .NET 中编写 SELECT 语句。
  • 可读字符串最长为 100 个字符。我将使用System.Security.Cryptography.AesCryptoServiceProvider 对其进行加密,并将其存储在nvarchar(300) 的数据库中。因此,存储在数据库中的加密字符串最长为 300 个字符。 LIKE 模式不会超过 100 个字符。

我做了什么(如有错误请纠正我):

  • 我考虑了数据库内置加密/解密功能。但是那些对服务器有完全访问权限的人将能够解密数据。

  • 我考虑使用 .NET 在应用程序级别加密数据,并创建一个可从 SQL Server 调用的 CLR 函数。 CLR 函数将解密同一 SELECT 语句中的数据。但是如何防止服务器管理员使用这个CLR函数来解密所有数据呢?

具体问题:我可以做些什么来保护我的数据免受数据库管理员的攻击,并且仍然能够使用 LIKE 查询它?如果不可能,我的最佳做法是什么?我可以阻止数据库服务器管理员使用 CLR 功能吗?

【问题讨论】:

  • 要搜索的字符串多长时间,like 模式多长时间?它会是一个简单的子字符串模式吗?
  • “最佳实践”通常是不让不值得信任的员工完全访问数据库。除此之外,您不能对应用程序中的数据进行加密,也不能在数据库中进行纯相等搜索之外的任何操作。您可以将所有数据拉入您的应用程序,在那里解密,然后执行类似操作。或者,如果您可以预先计算要在数据库中搜索的子表达式,并对数据库进行非规范化以存储这些子表达式。当然,这会使更改数据变得更加困难。
  • @usr,谢谢。可读字符串最长为 100 个字符。我将使用 System.Security.Cryptography.AesCryptoServiceProvider 对其进行加密,并将其存储在 nvarchar(300) 的数据库中。因此,存储在数据库中的加密字符串最长为 300 个字符。 LIKE 模式不会超过 100 个字符。
  • @Justin-cave,非常感谢。但是我可以阻止数据库服务器管理员使用 CLR 功能吗?
  • 没有。数据库管理员将能够运行您部署到数据库的任何代码。他们还应该能够嗅探来自或去往数据库的任何数据,因此您不能将未加密的数据传递给客户端或将加密密钥传递给数据库。我不清楚您的加密密钥存储在哪里以及为什么管理员不能简单地从中间层获取密钥,但这是一个单独的问题。

标签: sql-server security encryption


【解决方案1】:

更新:您可以在不同的盒子上使用您的秘密数据运行逻辑。制作一个使用您的数据但不公开它的 api。这需要在您控制的盒子上。如果那不可能,那么您就是 SOL。

您为什么要构建一个只有您可以使用的服务器应用程序?为什么不把它放在桌面上呢?

最好使用桌面应用程序来访问数据库,而不是像 ASP.NET 这样的 Web 服务器应用程序。

如果您对盒子没有完全的物理控制权,并且不信任管理员,那就有问题了。

如果您将解密密钥存储在网络服务器上,那么管理员将可以访问它。您需要一个解决方案,将解密密钥保存在您的计算机上,或者最好保存在智能卡中。您需要端到端加密。

你应该看看 ZeroDB 之类的东西,它可以完成上述http://www.zerodb.io/

它确实包含()但不是 LIKE。 http://docs.zerodb.io/#supported-queries

【讨论】:

  • 我组织中的每个人都会使用这个网站,而不仅仅是我。秘密数据对逻辑至关重要,但不会出现在网站页面中。是的,我不相信管理员会重复使用/窃取机密数据。
【解决方案2】:
  1. 对于每个查询,将所有字符串下载到客户端,解密并搜索它们。
  2. 或者,使用https://en.wikipedia.org/wiki/Homomorphic_encryption,这可能不太现实。
  3. 或者,生成所有可能的子字符串,以供like 找到。加密并存储它们。然后,您可以对它们进行平等匹配。对于 N 个字符串,大约有 N*N/2 个子字符串。由于攻击者可以推断出重复字符等,因此加密可能会因短字符串而失效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 2016-02-23
    • 2011-10-22
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2014-08-04
    • 2013-05-16
    相关资源
    最近更新 更多