簡略介紹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 |
ENCRYPTBYCert | DECRYPTBYCERT |
以上加解密演算法對於相同的值,每次加密結果都不同所以無法用來查詢比對資料
如果想查詢比對資料的話,必須先把DB裡的密文解密再和輸入的明文做比對,但通常這樣查詢效能都很差。
↓接下來就都不是SQL函數
資料行(Column)層級加密
原名 | 中譯 | 特性 | 感想 |
Always Encrypted | 永遠加密、一律加密 |
針對表格整個資料行的加密 |
諸多限制讓我一點也不考慮使用此功能 其他限制請見國外文章: T-SQL Tuesday #69 : Always Encrypted Limitations |
↑圖片出自:Using Always Encrypted with Entity Framework 6
檔案、資料庫層級加密
原名 | 中譯 | 特性 | 感想 |
Transparent Data Encryption |
透明資料加密 | 針對整個資料庫、備份檔的加密 即使資料庫、備份檔被偷走,沒有憑證&私錀的話 竊取者看不到資料,SSMS會報錯 |
請見個人文章: [SQL Server] 利用透明資料加密(TDE)對整個資料庫加密 |
Encrypting File System |
加密檔案系統 | 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資料庫安全性功能增長很多知識(讚