SQL列加密

SQL列加密

问题描述:

我个人认为SQL列加密是一个巨大的浪费;-),但由于客户推动必须实现它。所以我的问题是:SQL列加密

  1. 它究竟做了什么 - 管理员会看到加密的数据,但应用程序将看到明文数据?
  2. 数据备份后会发生什么?我假设备份保持加密状态,在这种情况下,如果我们需要恢复到不同的服务器上,它们是否可用?
  3. 加密密钥实际来自哪里?
  4. 我可以指定一个固定的加密密钥,以便至少数据库恢复很容易在我移动到的服务器上工作。我真的不想要一些神奇的关键算法,在密钥突然不可用的情况下,这些关键算法会在未来向我发射。

http://msdn.microsoft.com/en-us/library/ms179331.aspx

您可以创建一个对称密钥对数据进行加密,并可以使用一个字符串来创建它(与KEY_SOURCE选项),这将使您稍后重新创建它(这不是挂在样品位在文档中)。必须打开该窗口才能访问实际数据。这是由反过来由数据库主密钥保护证书的保护。不要丢失数据库主密钥的密码。数据库主密钥是由服务器密钥的保护,因此,如果您还原到另一台服务器必须打开与密码,并重新加密与新服务器的服务主密钥数据库主密钥。

如果你创建了一个静态字符串(KEY_SOURCE选项)对称密钥,那么你可以用不同的证书和数据库主密钥重新创建它,仍然可以访问您的加密数据。

-- backup service master key tied to computer (used to decrypt database master password, 
-- if this is the same on two servers you can move the database between them) 
BACKUP SERVICE MASTER KEY TO FILE = 'C:\ServiceMasterKey.smk' 
    ENCRYPTION BY PASSWORD = 'topsecret' 
go 
-- create database master key 
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'dbpassword' 
go 
-- create certificate to use to encrypt symmetric key 
CREATE CERTIFICATE TestCertificate WITH SUBJECT = 'Test Certificate', 
    EXPIRY_DATE = '01/01/2016' 
go 
-- create symmetric key to encrypt data 
CREATE SYMMETRIC KEY TestKey WITH ALGORITHM = TRIPLE_DES, 
    KEY_SOURCE ='pass_phrase' ENCRYPTION BY CERTIFICATE TestCertificate 
go 
create table CCInfo (ID int, Plain varchar(16), Encrypted varbinary(128)) 
go 
insert into CCInfo (ID, Plain) values (1, '1234567890ABCDEF') 
insert into CCInfo (ID, Plain) values (2, '1234123412341234') 
insert into CCInfo (ID, Plain) values (3, '1234567890ABCDEF') 
insert into CCInfo (ID, Plain) values (4, '1111111123456789') 
go 
-- encrypt credit card data 
OPEN SYMMETRIC KEY TestKey DECRYPTION BY CERTIFICATE TestCertificate 
update CCInfo set Encrypted = EncryptByKey(Key_GUID('TestKey'), Plain) 
CLOSE SYMMETRIC KEY TestKey 
go 
-- check that data is the same 
OPEN SYMMETRIC KEY TestKey DECRYPTION BY CERTIFICATE TestCertificate 
select ID, Plain, Encrypted, convert(varchar(16), DecryptByKey(Encrypted)) as Decrypted 
from CCInfo 
CLOSE SYMMETRIC KEY TestKey 

几件事情要注意:

  • 这就是所谓的“细胞级”加密,这是一个手动过程 - 你不能只是标记列作为“加密”
  • 它可能需要访问证书服务,它带有自己的一套的挑战和开销(我不看好这一点,它可能取决于你是否使用AD)

为了回答您的具体问题:

  1. 没有人直接在数据库中看到未加密的数据 - 您必须使用存储过程来加密和解密数据。该列本身必须转换为varbinary列。我相信访问可以基于密钥和存储过程进行控制。
  2. 数据备份为varbinary列。
  3. 加密密钥由具有相应权限的人在数据库中生成
  4. 我这么认为? this encryption tutorial的后半部分应该让你知道什么是必要的。

更多信息可在MSDN Database Encryption文档中找到。

如果客户推动列加密,但您不知道密钥实际来自哪里,那么您的客户正在浪费他的钱,而且您正在浪费他的时间。更甚的是,如果你甚至想到关于固定密钥

有关MSDN的详细解释说明密钥encryption hierarchy。所有这些方案都具有根据DPAPI的关键链,其中服务本身必须访问用户提供的任何密钥(无论是用户明确提供的密码)的加密存储。

加密是为缓解特定安全威胁而采取的措施。根据这些威胁是什么(他们没有在您的文章中指定)列级别加密可能是正确的答案,但几乎总是部署Transparent Database Encryption是一个更好的解决方案。

没有加密方案可以隐藏希望查看内容的管理员的内容。期。与之相反的每一个解决方案都是蛇油。

+1

这不正是如此。您可以创建一个受密码保护的对称密钥。只有这样,管理员可以访问这些数据是要找到密码。 – 2011-02-13 00:26:56