2011-02-12 45 views
2

我個人認爲SQL列加密是一個巨大的浪費;-),但由於客戶推動必須實現它。所以我的問題是:SQL列加密

  1. 它究竟做了什麼 - 管理員會看到加密的數據,但應用程序將看到明文數據?
  2. 數據備份後會發生什麼?我假設備份保持加密狀態,在這種情況下,如果我們需要恢復到不同的服務器上,它們是否可用?
  3. 加密密鑰實際來自哪裏?
  4. 我可以指定一個固定的加密密鑰,以便至少數據庫恢復很容易在我移動到的服務器上工作。我真的不想要一些神奇的關鍵算法,在密鑰突然不可用的情況下,這些關鍵算法會在未來向我發射。

回答

2

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 
0

幾件事情要注意:

  • 這就是所謂的「細胞級」加密,這是一個手動過程 - 你不能只是標記列作爲「加密」
  • 它可能需要訪問證書服務,它帶有自己的一套的挑戰和開銷(我不看好這一點,它可能取決於你是否使用AD)

爲了回答您的具體問題:

  1. 沒有人直接在數據庫中看到未加密的數據 - 您必須使用存儲過程來加密和解密數據。該列本身必須轉換爲varbinary列。我相信訪問可以基於密鑰和存儲過程進行控制。
  2. 數據備份爲varbinary列。
  3. 加密密鑰由具有相應權限的人在數據庫中生成
  4. 我這麼認爲? this encryption tutorial的後半部分應該讓你知道什麼是必要的。

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

3

如果客戶推動列加密,但您不知道密鑰實際來自哪裏,那麼您的客戶正在浪費他的錢,而且您正在浪費他的時間。更甚的是,如果你甚至想到關於固定密鑰

有關MSDN的詳細解釋說明密鑰encryption hierarchy。所有這些方案都具有根據DPAPI的關鍵鏈,其中服務本身必須訪問用戶提供的任何密鑰(無論是用戶明確提供的密碼)的加密存儲。

加密是爲緩解特定安全威脅而採取的措施。根據這些威脅是什麼(他們沒有在您的文章中指定)列級別加密可能是正確的答案,但幾乎總是部署Transparent Database Encryption是一個更好的解決方案。

沒有加密方案可以隱藏希望查看內容的管理員的內容。期。與之相反的每一個解決方案都是蛇油。

+1

這不正是如此。您可以創建一個受密碼保護的對稱密鑰。只有這樣,管理員可以訪問這些數據是要找到密碼。 – 2011-02-13 00:26:56