[SQL Server] 資料庫安全功能快速Overview

簡略介紹SQL Server各種資料庫安全功能心得

前言

最近客戶需要對資料庫進行加解密需求,讓本人研究學習不少東西,整理以下

不負責任隨便評感想

單一儲存格(Cell)層級加密

都是SQL函數:密碼編譯函式 (TRANSACT-SQL)

    特性 感想
Convert(varbinary(8000),nvarchar(255)) Convert(nvarchar(255),varbinary(8000)) 單純資料的型別轉換,
把明文偽裝成二進位資料讓人誤以為資料被加密XD
相同的值Convert成varbinary之後的資料都是一樣,所以可以查詢比對
varbinary也可以Convert回原本的明文
類似.net的兩個方法Convert.ToBase64String()、
Convert.FromBase64String()
安全性較弱
HASHBYTES()   雜湊,無須金鑰,所以有些人認為不算是加密演算法
相同的值每次經過雜湊後結果都會一樣,所以可以查詢比對
但雜湊過後的結果不可逆推回原本的明文
為了避免被側錄出T-SQL語句:HASHBYTES('SHA1',N'明文')  
--謎之音:這筆資料叫"明文"

記得加入無法猜測的塩巴後再雜湊:
HASHBYTES('SHA1', Cast(NEWID() as nvarchar(255))+N'明文') 
--謎之音:這筆資料是…?
※NEWID()函數示意用,實務上請替換成該表格的其它欄位名稱

SQL Server 支援的雜湊演算法:
HASHBYTES
MD開頭那種被破解的演算法就請勿使用

加解密演算法

對稱式加解密 特性 感想
ENCRYPTBYKEY DECRYPTBYKEY 對稱金鑰加密、自訂密碼or非對稱金錀或憑證解密
取決於OPEN SYMMETRIC KEY 對稱金鑰 DECRYPTION BY What?
由於是對稱式加密演算法,加解密之前都要
OPEN SYMMETRIC KEY 對稱金鑰 DECRYPTION BY {CERTIFICATE|PASSWORD|ASYMMETRIC KEY} 
--DECRYPTION三選一,看解密是什麼函數解
執行完畢還得
CLOSE SYMMETRIC KEY 對稱金鑰  
DECRYPTBYKEYAUTOASYMKEY 對稱金鑰加密、非對稱金鑰解密
DecryptByKeyAutoCert 對稱金鑰加密、憑證解密
ENCRYPTBYPASSPHRASE DECRYPTBYPASSPHRASE 使用自訂通關密碼加密、同樣密碼解密 函數好用好理解,只是寫死加密密碼的話容易被側錄出來
非對稱式加解密 加解密成本高,不適合大量資料使用
ENCRYPTBYASYMKEY DECRYPTBYASYMKEY 這兩種演算法通常解密時需要傳遞密碼來解密

不過我也看過國外文章有人在建立非對稱金錀時沒設PASSWORD
變成解密時可不用傳遞密碼,
加解密動作變得很像對稱式加解密,
而且還不用Open、Close金鑰XD

ENCRYPTBYCert DECRYPTBYCERT

以上加解密演算法對於相同的值,每次加密結果都不同所以無法用來查詢比對資料

如果想查詢比對資料的話,必須先把DB裡的密文解密再和輸入的明文做比對,但通常這樣查詢效能都很差。

↓接下來就都不是SQL函數

資料行(Column)層級加密

原名 中譯 特性 感想
Always Encrypted 永遠加密、一律加密

針對表格整個資料行的加密

無法對有預設值的資料行加密
SQL語法如果對加密資料行Order by排序會出錯
加密資料行無法下Like條件模糊比對

CRUD操作資料一律都得參數化
即使程式使用Entityframe Work存取資料庫也不例外,請見下圖↓

諸多限制讓我一點也不考慮使用此功能
其他限制請見國外文章:
T-SQL Tuesday #69 : Always Encrypted Limitations

↑圖片出自:Using Always Encrypted with Entity Framework 6

檔案、資料庫層級加密

原名 中譯 特性 感想

Transparent Data Encryption
簡稱:TDE

透明資料加密 針對整個資料庫、備份檔的加密
即使資料庫、備份檔被偷走,沒有憑證&私錀的話
竊取者看不到資料,SSMS會報錯
請見個人文章:
[SQL Server] 利用透明資料加密(TDE)對整個資料庫加密

Encrypting File System
簡稱:EFS

加密檔案系統 Windows內建功能,防止被偷走檔案 應該不算微軟資料庫安全功能的範疇,
但IBM建議沒有SQL Server Enterprise的TDE加密功能的話
可使用Windows的EFS替代,我就列出來了
在 SQL Server 資料庫上啟用透通資料加密

資料篩選、過濾

原名 中譯 特性 感想
Row-Level Security
簡稱:RLS
資料列層級安全性 使用者限閱資料的概念 在SQL Server 2016以前大家都是使用
View檢視、Stored Procedure預存程序實現同樣效果
Dynamic Data Masking 動態資料遮罩 可讓特定使用者查看資料時,資料被遮罩處理,
但不影響新刪修資料
SQL Server 2016的新功能,
在此之前都是仰賴AP端程式處理

應用程式相關

名稱 特性 感想
ASP.net Web.config組態檔區段加密 使用aspnet_regiis.exe加密ASP.net網站的資料庫
connectionStrings連線字串區段
預防有人取得Web.config後知道如何進入SQL Server
加密後的連線字串,在程式裡會自動解密,無須更改程式。

 

結語

還有一項AP Server和DB Server之間的加密傳輸連線,類似TLS通訊協定,因為偏向網管、DBA領域,我就沒太深入研究如何設定(畢竟我是小小的打字員XD)

目前我看到的、整理的都是至SQL Server 2016為止的功能,SQL Server 2017之後新增的安全性功能,如果日後有空再補

然後推薦一下網友StanleyJui撰寫的系列文:資料安全與簡單加密演算法見面會

看完30篇系列文會對SQL Server資料庫安全性功能增長很多知識(讚