【问题标题】:Where to use the column-level encryption of SQL?SQL的列级加密在哪里使用?
【发布时间】:2019-05-08 19:06:23
【问题描述】:

我能够使用以下代码在 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

现在我的问题是,如果任何可以访问此数据库的人都可以运行 DecryptByKey 函数来查看解密值,这对安全性有何帮助?我对数据库主密钥和证书的使用并不完全熟悉,所以请多多包涵。

【问题讨论】:

    标签: sql sql-server tsql encryption certificate


    【解决方案1】:

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

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

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

    OPEN SYMMETRIC KEY ... DECRYPTION BY CERTIFICATE ...
    

    尝试创建一个无权访问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;
    

    你会得到以下错误:

    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.
    

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

    permission diagram 展示了更大的图景,但基本上:

    或简而言之:

    • 系统管理员
    • db_owner
    • 证书的创建者
    • 已获得证书访问权限的用户

    另外,关于备份的一些事情。例如,当您创建备份并在不同的实例上恢复它时,您需要重新创建安全层次结构。基本上在这样的数据库上,即使sys.admin 也无法访问密钥。

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

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

    【讨论】:

    • 这是一个很好的解释!谢谢!
    猜你喜欢
    • 2017-11-22
    • 2020-06-10
    • 2012-08-14
    • 2022-01-07
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多