哪里使用SQL的列级加密?

Amo*_*ore 5 sql t-sql sql-server encryption certificate

我能够使用以下代码在 SQL 中进行列加密:

USE EncryptionDemonstration

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'ThisIsMySampleStrongPassword'

CREATE CERTIFICATE MyServerCertificate WITH SUBJECT = 'This is my Demonstration Certificate'


CREATE SYMMETRIC KEY SSN_Keys  
    WITH ALGORITHM = AES_256  
    ENCRYPTION BY CERTIFICATE MyServerCertificate;  
GO  
CREATE SYMMETRIC KEY CreditCard_Keys  
    WITH ALGORITHM = AES_128  
    ENCRYPTION BY CERTIFICATE MyServerCertificate;  

ALTER TABLE Customer
    ADD SSN_Encrypted varbinary(128),
        CCN_Encrypted varbinary(128)

OPEN SYMMETRIC KEY CreditCard_Keys 
   DECRYPTION BY CERTIFICATE MyServerCertificate 
OPEN SYMMETRIC KEY SSN_Keys 
   DECRYPTION BY CERTIFICATE MyServerCertificate

UPDATE  Customer 
SET SSN_Encrypted = EncryptByKey(Key_GUID('SSN_Keys')  
    , SocialSecurityNumber)

UPDATE  Customer 
SET CCN_Encrypted = EncryptByKey(Key_GUID('CreditCard_Keys  ')  
    , CreditCardNumber)

GO  

OPEN SYMMETRIC KEY SSN_Keys
   DECRYPTION BY CERTIFICATE MyServerCertificate 

OPEN SYMMETRIC KEY CreditCard_Keys
   DECRYPTION BY CERTIFICATE MyServerCertificate 



SELECT SocialSecurityNumber, SSN_Encrypted   
    AS 'Encrypted SSN',  
    CONVERT(varchar, DecryptByKey(SSN_Encrypted))   
    AS 'Decrypted SSN'  
    FROM Customer  

SELECT CreditCardNumber, CCN_Encrypted 
    AS 'Encrypted Credit Card Number',
     CONVERT(varchar, DecryptByKey(CCN_Encrypted))   
     AS 'Decrypted Credit Card Number'
     FROM Customer
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,如果在这个数据库上访问过它的任何人都可以运行 DecryptByKey 函数来查看解密的值,那么这对安全性有什么帮助?我不完全熟悉数据库主密钥和证书的使用,所以请耐心等待。

got*_*tqn 6

答案是,每个人都可以运行DecryptByKey,但不是每个人都可以访问用于保护数据的对称密钥。SQL Server 中有严格的加密层次结构,您选择了以下路径:

  1. 数据库主密钥是受保护的密码
  2. 受 DMK 保护的证书
  3. 受证书保护的对称密钥
  4. 对称密钥加密的数据

在此处输入图片说明

因此,每个有权访问对称密钥的人都可以使用它,但要做到这一点,需要访问保护给定对称密钥的证书。这就是为什么,您正在使用:

OPEN SYMMETRIC KEY ... DECRYPTION BY CERTIFICATE ...
Run Code Online (Sandbox Code Playgroud)

尝试创建一个无权访问的用户CERTIFICATE并执行上述语句:

DROP USER IF EXISTS [StackOverflow];

CREATE USER [StackOverflow] WITHOUT LOGIN;

EXECUTE AS USER = 'StackOverflow';

OPEN SYMMETRIC KEY [SK_SecurityUsers_V001] DECRYPTION BY CERTIFICATE [CERT_V001];

REVERT;
Run Code Online (Sandbox Code Playgroud)

您将收到以下错误:

Msg 15151, Level 16, State 1, Line 7
Cannot find the symmetric key 'SK_SecurityUsers_V001', because it does not exist or you do not have permission.
Run Code Online (Sandbox Code Playgroud)

因此,这取决于您谁可以使用对称密钥来控制对保护它的证书的访问。问题是,谁可以访问证书?

权限图是示出了更大的图片,但基本上是:

在此处输入图片说明

或简而言之:

  • 系统管理员
  • 数据库所有者
  • 证书创建者
  • 已获得证书访问权限的用户

另外,关于备份的一些事情。例如,当您创建备份并在不同实例上恢复它时,您需要重新创建安全层次结构。基本上就这样的数据库,连sys.adminkey都进不去。

因此,如果有人窃取了您的备份,数据将再次受到保护。您需要备份您的证书并在新数据库中再次恢复它,或者使用CERTENCODED创建相同的证书。

这只是触及表面,在加密数据之前很好地计划任何方面(例如,加密列上的索引是无用的,因为加密时会向每个值添加随机盐 - 多次加密一个值,每次都会得到不同的二进制文件)。