詳解 SQL 中的加密
點擊關注上方“SQL數(shù)據(jù)庫開發(fā)”,
設為“置頂或星標”,第一時間送達干貨 SQL專欄 SQL基礎知識第二版
SQL高級知識第二版
加密是指通過使用密鑰或密碼對數(shù)據(jù)進行模糊處理的過程。在SQL Server中,加密并不能替代其他的安全設置,比如防止未被授權的人訪問數(shù)據(jù)庫或是數(shù)據(jù)庫實例所在的Windows系統(tǒng),甚至是數(shù)據(jù)庫所在的機房,而是作為當數(shù)據(jù)庫被破解或是備份被竊取后的最后一道防線。通過加密,使得未被授權的人在沒有密鑰或密碼的情況下所竊取的數(shù)據(jù)變得毫無意義。這種做法不僅僅是為了你的數(shù)據(jù)安全,有時甚至是法律所要求的(像國內某知名IT網(wǎng)站泄漏密碼這種事在中國可以道歉后不負任何責任了事,在米國妥妥的要破產清算)。
加密是指通過使用密鑰或密碼對數(shù)據(jù)進行模糊處理的過程。加密解密最簡單的過程如圖1所示。

現(xiàn)在流行的很多加密算法都是工業(yè)級的,比如對稱加密的算法有:DES、3DES、IDEA、FEAL、BLOWFISH.而非對稱加密的算法比如經(jīng)典的RSA。因為這些算法已經(jīng)公布了比較長的時間,并且經(jīng)受了很多人的考驗,所以通常來說都是比較安全的。
強加密通常會比較弱的加密占用更多的 CPU 資源。 長密鑰通常會比短密鑰生成更強的加密。 非對稱加密比使用相同密鑰長度的對稱加密更強,但速度相對較慢。 使用長密鑰的塊密碼比流密碼更強。 復雜的長密碼比短密碼更強。 如果您正在加密大量數(shù)據(jù),應使用對稱密鑰來加密數(shù)據(jù),并使用非對稱密鑰來加密該對稱密鑰。 不能壓縮已加密的數(shù)據(jù),但可以加密已壓縮的數(shù)據(jù)。如果使用壓縮,應在加密前壓縮數(shù)據(jù)。
在SQL Server中,加密是分層級的.根層級的加密保護其子層級的加密。概念如圖2所示。

CREATE MASTER KEY ENCRYPTION BY PASSWORD ='Pa$$word'
--創(chuàng)建證書
CREATE CERTIFICATE CertTest
with SUBJECT = 'Test Certificate'
GO
--創(chuàng)建非對稱密鑰
CREATE ASYMMETRIC KEY TestAsymmetric
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD = 'pa$$word';
GO
--創(chuàng)建對稱密鑰
CREATE SYMMETRIC KEY TestSymmetric
WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = 'pa$$word';
GO
--由證書加密對稱密鑰
CREATE SYMMETRIC KEY SymmetricByCert
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE CertTest;
GO
--由對稱密鑰加密對稱密鑰
OPEN SYMMETRIC KEY TestSymmetric
DECRYPTION BY PASSWORD='pa$$word'
CREATE SYMMETRIC KEY SymmetricBySy
WITH ALGORITHM = AES_256
ENCRYPTION BY SYMMETRIC KEY TestSymmetric;
GO
--由非對稱密鑰加密對稱密鑰
CREATE SYMMETRIC KEY SymmetricByAsy
WITH ALGORITHM = AES_256
ENCRYPTION BY ASYMMETRIC KEY TestASymmetric;
GO
SQL Server在2005引入了列加密的功能。使得可以利用證書,對稱密鑰和非對稱密鑰對特定的列進行加密。在具體的實現(xiàn)上,根據(jù)加密解密的方式不同,內置了4對函數(shù)用于加密解密:
EncryptByCert() 和DecryptByCert()—利用證書對數(shù)據(jù)進行加密和解密 EncryptByAsymKey() and DecryptByAsymKey()—利用非對稱密鑰對數(shù)據(jù)進行加密和解密
EncryptByKey() and DecryptByKey()—利用對稱密鑰對數(shù)據(jù)進行加密和解密EncryptByPassphrase() and DecryptByPassphrase()—利用密碼字段產生對稱密鑰對數(shù)據(jù)進行加密和解密

SELECT CreditCardID,
CardType,
CardNumber_encrypt = CONVERT(varbinary(500), CardNumber),
ExpMonth,
ExpYear,
ModifiedDate
INTO Sales.CreditCard_Encrypt
FROM Sales.CreditCard
WHERE 1<>1
--打開之前創(chuàng)建的由證書加密的對稱密鑰
OPEN SYMMETRIC KEY SymmetricByCert
DECRYPTION BY CERTIFICATE CertTest
--利用這個密鑰加密數(shù)據(jù)并插入新建的表
insert Sales.CreditCard_encrypt (
CardType,
CardNumber_encrypt,
ExpMonth,
ExpYear,
ModifiedDate
)
select top 10
CardType,
CardNumber_encrypt = EncryptByKey(KEY_GUID('SymmetricByCert'), CardNumber),
ExpMonth,
ExpYear,
ModifiedDate
from Sales.CreditCard

OPEN SYMMETRIC KEY SymmetricByCert
DECRYPTION BY CERTIFICATE CertTest
select CardType,
CardNumber = convert(nvarchar(25), DecryptByKey(CardNumber_encrypt)),
ExpMonth,
ExpYear,
ModifiedDate
from Sales.CreditCard_encrypt
在SQL Server 2008中引入了透明數(shù)據(jù)加密(以下簡稱TDE),之所以叫透明數(shù)據(jù)加密,是因為這種加密在使用數(shù)據(jù)庫的程序或用戶看來,就好像沒有加密一樣。TDE加密是數(shù)據(jù)庫級別的。數(shù)據(jù)的加密和解密是以頁為單位,由數(shù)據(jù)引擎執(zhí)行的。在寫入時進行加密,在讀出時進行解密。客戶端程序完全不用做任何操作。

--基于我們之前創(chuàng)建的證書CertTest,創(chuàng)建DEK
--CertTest需要在Master數(shù)據(jù)庫中
USE AdventureWorks
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE CertTest
GO
--開啟TDE
ALTER DATABASE AdventureWorks
SET ENCRYPTION ON


本文介紹了加密的基本概念,SQL Server中加密的層級,以及SQL Server中提供的兩種不同的加密方式。SQL Server的TDE是一個非常強大的功能,在用戶程序中不做任何改變就能達到數(shù)據(jù)庫層面的安全。在使用SQL Server提供的加密技術之前,一定要先對加密的各個功能概念有一個系統(tǒng)的了解,否則很有可能造成的后果是打不開數(shù)據(jù)庫。準備在后續(xù)文章中再寫關于證書,密鑰的備份和恢復….

數(shù)據(jù)前線
后臺回復關鍵字:1024,獲取一份精心整理的技術干貨 后臺回復關鍵字:進群,帶你進入高手如云的交流群。 推薦閱讀
評論
圖片
表情
