SQL Server WITH ENCRYPTION VS TDE

在SQL Server 2014(12.x)版本中,在BACKUP DATABASE的參數中增加了ENCRYPTION參數,即備份時,對寫入文件的數據進行加密。那麼該參數是如何使用的呢?WITH ENCRYPTION 加密對性能有怎樣的影響?其和TDE有怎樣的關係,兩者對性能影響情況如何?本文將通過實例說明,給出該參數用法,並與TDE進行對比。

創建測試環境

創建數據庫test,並在test庫下創建表test,向表中插入一條記錄:

USE master
GO
CREATE DATABASE test ON PRIMARY
(name='test',filename='D:\DB\Test\test.mdf')
LOG ON
(name='test_log',filename='D:\DB\Test\test_log.ldf')
USE test
GO
CREATE TABLE test ( id INT, name VARCHAR(10) )
INSERT  INTO test
VALUES  ( 1, 'Jack' )

要使用WITH ENCRYPTION 參數備份數據庫,和TDE一樣,首先需要創建數據庫主祕鑰、服務器證書,並備份證書:

USE master
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD= 'jC`T?]K,v`{voD<'
CREATE CERTIFICATE TestBackOption
WITH SUBJECT = 'My DEK Certificate for test database backup option'
BACKUP CERTIFICATE TestBackOption
TO FILE ='D:\TestBackOption.cer'
WITH PRIVATE KEY(FILE='D:\TestBackOption_Key.pvk',
ENCRYPTION BY PASSWORD='[J,XJK8|AwE*rLk')

使用ENCRYPTION備份選項,在備份時,對備份文件加密:

BACKUP DATABASE [test] 
TO DISK = N'D:\TestWithBackOptionEncryption.bak' 
WITH 
  COMPRESSION, 
  ENCRYPTION  
   ( 
   ALGORITHM = AES_256, 
   SERVER CERTIFICATE = TestBackOption 
   ), 
  STATS = 10 
GO

注意,和TDE不用一樣,需要創建數據庫祕鑰,然後在將數據庫文件數據進行加密。使用ENCRYPTION加密備份文件,是在備份時,將數據加密後寫入備份文件。

接下來,我們使用記事本打開數據庫備份文件,查找“Jack”,我們發現,查不到明文“Jack”,驗證確實達到了加密的效果。

WITH ENCRYPTION 有兩個參數,分別是加密算法和加密方式,我們可以選用的加密算法包括: AES 128、AES 192、AES 256 和 Triple DES;加密方式可以是證書或非對稱密鑰

 

日誌備份、文件或文件組備份時也可以使用ENCRYPTION參數對數據進行加密。

使用TDE加密的數據庫,仍然可以使用ENCRYPTION參數進行加密。

備份時加密的備份文件,還原的時候和TDE數據庫一樣,也需要先在實例上創建主祕鑰,還原服務器證書、私鑰,並不需要在還原腳本中增加參數

 

從上文可以看出,相對TDE,WITH ENCRYPTION數據庫備份方式,是在備份時將數據加密後寫入備份文件的,這樣我們可以合理安排備份策略,避開高峯期數據讀寫加密、解密對數據庫性能的影響。那麼我們是不是就可以棄用TDE了呢?使用數據庫備份時對文件進行加密會有什麼影響嗎?

第一個問題很好回答,首先,因爲數據庫備份時對備份文件進行加密是SQL Server 2014(12.x)版本的新功能,SQL Server 2014以前的版本是不能使用的,所以還是不能直接替代的,除非您的組織願意花費成本去將SQL Server升級到 2014或者更高的版本。其次因爲數據庫中的數據是沒有進行加密的,線上數據更容易被黑客盜取。綜上兩個原因,TDE仍然是不可替代的。

下面我們將通過試驗對比數據庫備份時對數據庫備份文件進行加密和TDE,我們使用《SQL Server 透明數據加密(TDE)的影響》一文中test數據庫,爲了保證數據庫數據量一致,減少其他因素的影響,我們先使用WITH ENCRYPTION加密選項對數據庫test進行備份:

DECLARE @bdatetime AS DATETIME=GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE [test] 
TO DISK = N'D:\TestWithBackOptionEncryption.bak' 
WITH 
  COMPRESSION, 
  ENCRYPTION  
   ( 
   ALGORITHM = AES_256, 
   SERVER CERTIFICATE = TestBackOption 
   ), 
  STATS = 10 
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT @bdatetime,GETDATE(),DATEDIFF(millisecond,@bdatetime,GETDATE())
GO

 

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328592 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 3 頁。

BACKUP DATABASE 成功處理了 328595 頁,花費 62.830 秒(40.858 MB/秒)。

 

 SQL Server 執行時間:

   CPU 時間 = 265 毫秒,佔用時間 = 63160 毫秒。

 

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

(1 行受影響)

對test庫啓動TDE

加密算法和數據庫備份選項中的加密算法一樣,均使用AES_256

USE test
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM= AES_256
ENCRYPTION BY SERVER CERTIFICATE TestBackOption
ALTER DATABASE test SET ENCRYPTION ON

查看動態視圖 sys.dm_database_encryption_keys 中的列percent_complete ,確認其重新變爲0後,說明加密完成:

SELECT  DB_NAME(database_id) DBName, percent_complete
FROM    sys.dm_database_encryption_keys


接下來我們來備份TDE數據庫:

USE test
GO
DECLARE @bdatetime AS DATETIME=GETDATE()
SET STATISTICS IO ON
SET   STATISTICS TIME ON
BACKUP DATABASE [test] 
TO DISK = N'D:\Test_TDE.bak' 
WITH    STATS = 10 
SET STATISTICS IO OFF
SET   STATISTICS TIME OFF
SELECT @bdatetime,GETDATE(),DATEDIFF(millisecond,@bdatetime,GETDATE())
GO

已處理百分之 10。

已處理百分之 20。

已處理百分之 30。

已處理百分之 40。

已處理百分之 50。

已處理百分之 60。

已處理百分之 70。

已處理百分之 80。

已處理百分之 90。

已爲數據庫 'test',文件 'test' (位於文件 1 上)處理了 328544 頁。

已處理百分之 100。

已爲數據庫 'test',文件 'test_log' (位於文件 1 上)處理了 3 頁。

BACKUP DATABASE 成功處理了 328547 頁,花費 138.508 秒(18.531 MB/秒)。

 SQL Server 執行時間:

   CPU 時間 = 157 毫秒,佔用時間 = 138843 毫秒。

 SQL Server 執行時間:

   CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。

完成時間: 2020-02-26T14:04:50.9311361+08:00

可以看到TDE數據庫備份消耗的時間是備份時加密備份文件消耗時間的1倍左右,而兩者CPU消耗時間近乎一致,因爲TDE數據庫的備份是先加密後解密的過程。

結合《SQL Server 透明數據加密(TDE)的影響》,如果您已經在使用SQL Server 2014(12.x)或者更高版本的SQL Server 數據庫,並且您已經使用其他安全措施,保證數據庫數據的安全。可以考慮使用備份時對備份文件加密,即使用的備份的參數:

ENCRYPTION  

   ( 

   ALGORITHM = AES_256, 

   SERVER CERTIFICATE = TestBackOption 

   )

注意:但TDE是不可替代的,因爲備份時對備份文件加密,存在的安全隱患,即生產環境數據庫文件是沒有加密的,此數據庫文件被竊,或者被未授權的用戶訪問,或者被黑客攻擊,仍然會暴露組織的隱私數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章