【发布时间】: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