代码之家  ›  专栏  ›  技术社区  ›  DeclanMcD

如何在SQL Server 2012中加密某些行的某些列

  •  2
  • DeclanMcD  · 技术社区  · 10 年前

    我有一个应用程序,出于安全原因,需要对某些数据列进行模糊处理或加密。并不是所有的行都需要加密这些列,只有特定的数量。

    任何访问数据库的人都无法读取数据,但显然需要在应用程序中显示。即使如此,它也只能显示给某些人。所有用户都通过LDAP进行身份验证。

    我的方法如下:

    数据输入:

    1. 数据是否来自需要加密的数据源?
    2. 然后使用安全密钥加密所有相关列并输入数据库

    应用程序中的数据:

    1. 用户是否经过身份验证?
    2. 该用户是否启用了相关的安全标志?
    3. 显示每个数据行时,检查该数据行是否包含加密数据
    4. 若有,则使用安全密钥解密并显示在屏幕上。

    这种方法引发了有关密钥存储位置和方式以及谁有权访问密钥的问题。

    即使是开发人员或DBA也无法访问这些数据,除非他们获得授权。

    我不想过多地影响应用程序的性能,特别是如果它必须一次显示几百条记录。

    该应用程序采用C#,具有SQL Server 2012后端。

    实施此方案的最佳方法是什么?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Community CDub    8 年前

    您可以将密钥存储在注册表中,并使用 DAPI 。为了使密钥更安全,您应该使用用户而不是系统DAPI版本。看见 this question 。您还应设置注册表项的权限,以限制哪些用户可以读取该项。您还可以将DAPI加密字符串存储在文件(web.config)中。

    请注意,当您以用户身份登录时,必须在计算机上加密字符串。这使得发布密钥更加困难,因为您不能简单地从开发服务器复制DAPI保护的密钥。

    将应用程序池用户设置为,以便它可以访问注册表项,并且是用于使用DAPI加密密钥的用户。

    通过将授权和加密/解密放在一个单独的服务中,您可能会使一切更加安全。将服务设置为使用DAPI用户名而不是应用程序池用户。棘手的部分是服务和网站之间的安全通信。

    最后,您可以使用 SecureString 在使用DAPI解密密钥后,用于密钥传输。您可能希望使用String开发所有内容,然后切换到SecureString,以便进行调试。这里有一个问题 SecureString example .

    对于开发,只需使用与生产中不同的密钥即可。开发人员将能够测试信息的编码和解码,但不能解码任何生产数据。无论如何,您的开发人员确实不应该访问未经清理的生产数据。