如何加密 SQL Server 2012 中某些行的某些列
How to encrypt certain columns of certain rows in SQL Server 2012
出于安全原因,我有一个应用程序需要对某些数据列进行模糊处理或加密。并非所有行都需要加密这些列,只有一定数量。
任何有权访问数据库的人都无法读取数据,但显然需要在应用程序中显示。即使这样,它也只能显示给某些人。所有用户都通过 LDAP 进行身份验证。
我的方法如下:
输入的数据:
- 来自数据源的数据是否需要加密?
- 然后用安全密钥加密所有相关列并输入数据库
应用程序中出现的数据:
- 用户是否通过身份验证?
- 该用户是否启用了相关的安全标志?
- 显示每个数据行时,检查该数据行是否有加密数据
- 如果有,则使用安全密钥对其进行解密并显示在屏幕上。
这种方法引发了有关密钥存储位置和方式以及谁有权访问它的问题。
即使是开发人员或 DBA 也无权访问该数据,除非他们获得授权。
我不想对应用程序的性能造成太大影响,尤其是当它必须一次显示几百条记录时。
该应用程序在 C# 中,后端为 SQL Server 2012。
实现此方案的最佳方法是什么?
您可以将密钥存储在注册表中并使用 DAPI. To make the key more secure, you should use the user and not system DAPI version. See this question 对其进行加密。您还应该设置注册表项的权限以限制哪些用户可以读取该注册表项。您还可以将 DAPI 加密字符串存储在文件中 (web.config)。
请注意,当以用户身份登录时,您必须在机器上加密字符串。这使得发布密钥变得更加困难,因为您不能简单地从开发服务器复制受 DAPI 保护的密钥。
设置您的应用程序池用户,以便它可以访问注册表项,并且是用于使用 DAPI 加密密钥的同一用户。
您可以通过将授权和 encryption/decryption 放入单独的服务中来使一切更加安全。将服务设置为使用 DAPI 用户名而不是应用程序池用户。棘手的部分是您的服务和网站之间的安全通信。
最后,您可以使用 SecureString for key transport after you decrypt the key using DAPI. You might want to develop everything using String and switch to SecureString so that you can debug. Here is a question with a SecureString example 让一切变得更安全。
对于开发,只需使用与生产中不同的密钥即可。开发人员将能够测试信息的编码和解码,但不能解码任何生产数据。无论如何,您的开发人员真的不应该访问未净化的生产数据。
出于安全原因,我有一个应用程序需要对某些数据列进行模糊处理或加密。并非所有行都需要加密这些列,只有一定数量。
任何有权访问数据库的人都无法读取数据,但显然需要在应用程序中显示。即使这样,它也只能显示给某些人。所有用户都通过 LDAP 进行身份验证。
我的方法如下:
输入的数据:
- 来自数据源的数据是否需要加密?
- 然后用安全密钥加密所有相关列并输入数据库
应用程序中出现的数据:
- 用户是否通过身份验证?
- 该用户是否启用了相关的安全标志?
- 显示每个数据行时,检查该数据行是否有加密数据
- 如果有,则使用安全密钥对其进行解密并显示在屏幕上。
这种方法引发了有关密钥存储位置和方式以及谁有权访问它的问题。
即使是开发人员或 DBA 也无权访问该数据,除非他们获得授权。
我不想对应用程序的性能造成太大影响,尤其是当它必须一次显示几百条记录时。
该应用程序在 C# 中,后端为 SQL Server 2012。
实现此方案的最佳方法是什么?
您可以将密钥存储在注册表中并使用 DAPI. To make the key more secure, you should use the user and not system DAPI version. See this question 对其进行加密。您还应该设置注册表项的权限以限制哪些用户可以读取该注册表项。您还可以将 DAPI 加密字符串存储在文件中 (web.config)。
请注意,当以用户身份登录时,您必须在机器上加密字符串。这使得发布密钥变得更加困难,因为您不能简单地从开发服务器复制受 DAPI 保护的密钥。
设置您的应用程序池用户,以便它可以访问注册表项,并且是用于使用 DAPI 加密密钥的同一用户。
您可以通过将授权和 encryption/decryption 放入单独的服务中来使一切更加安全。将服务设置为使用 DAPI 用户名而不是应用程序池用户。棘手的部分是您的服务和网站之间的安全通信。
最后,您可以使用 SecureString for key transport after you decrypt the key using DAPI. You might want to develop everything using String and switch to SecureString so that you can debug. Here is a question with a SecureString example 让一切变得更安全。
对于开发,只需使用与生产中不同的密钥即可。开发人员将能够测试信息的编码和解码,但不能解码任何生产数据。无论如何,您的开发人员真的不应该访问未净化的生产数据。