[SQL Server]使用SQL Server內建的加密方法

[SQL Server]使用SQL Server內建的加密方法

前兩天聽到有人提到SQL Server本身也有提供加密方法讓我們可以對我們的使用者密碼做加密,確保資料不會被竊取,這是我以前完全不考慮的做法,其原因有三:

1.綁定資料庫,其他的資料庫系統就不能用了(總不會想SQL Server用內建,Oracle用程式寫吧?)

2.舊版本的SQL Server也沒有支援(SQL Server 2005後才有提供此功能)

3.不好debug(不能解密回來看到底哪邊錯了)

雖然短時間內我仍不會在產品內用這方法,但了解一下也不錯啦,在拜讀了Tiger投稿在RUN!PC的文章後,大致了解了這個加密功能的使用,以下簡單示範一下,我先下一段SQL,其中hashbytes代表的是SQL Server所提供的加密function而MD5就是大家所熟知的加密演算法囉,我使用以下的SQL指令將12345做了加密:

但卻發現我剛剛insert的資料出現了亂碼,依據Tiger跟MSDN的說法,hashbytes這個fucntion回傳的為「varbinary」而不是「字串」形態,所以我們需要使用sys.fn_VarBinToHexStr() function來幫我們轉換成字串:

image

 

我修改一下我的SQL指令,加上sys.fn_VarBinToHexStr() function:

這時就發現資料正確囉,呈現了MD5加密過後的資料﹕

image

 

OK,玩到這邊時我才想到一個問題,雜湊法應該是不可逆的,也就是說無法將這段資料解密回來,那我們程式要如何去判斷?呵,因為它每次雜湊出來的結果都一樣(有可能被暴力法攻破),所以其實我們只要使用這句SQL就可以得到我們想要的結果囉:

 

下圖我們可以同時看到我下的SQL、我查出來的結果與兩次雜湊後的結果是相同:

image

 

這個功能是挺方便的,可以讓我們的資料做到一些基本的保護,在不考量我前頭提到的三點的狀況下,可以考慮使用此功能來進行資料加密,但因為不可逆,大概也只比較適合用在密碼一類的資料上吧。

 

參考資料:

Microsoft SQL Server欄位字串加密應用 簡單為資訊系統加入安全機制

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。