加入RUN!PC粉絲團
最近新增的精選文章
 
最多人點閱的精選文章
 
 
精選文章 - 開發技術
分享到Plurk
分享到FaceBook
 
Microsoft SQL Server欄位字串加密應用
簡單為資訊系統加入安全機制
文/圖 林柏甫.責任編輯/洪羿漣

大多數的人都有一個疑問:為什麼資料庫中的密碼欄位一定要加密,反正密碼都是存在資料庫中,只要程式寫的安全,一般人也無法透過程式的漏洞來取得密碼,幹嘛那麼麻煩?其實在資安環節之中,這可是一個非常嚴重的問題。

應用程式與系統不可能百分之百的安全。哪一天真的被入侵了,整個資料就攤在Cracker眼前任憑處置。以線上遊戲來說,Cracker取得帳號與密碼後,可以隨意的先取用一組帳號密碼登入遊戲,再觀察哪個ID等級最高、金錢最多、寶物最好等等。等獵物下線後,將該ID名貴的寶物以及其相關物品都轉到另外一個帳號,並將虛擬寶物賣掉。

以上是一個虛構的例子,但並不是使用鍵盤側錄器或是木馬來竊取帳號密碼,而是帳號密碼資訊經由入侵系統漏洞,並進行操作取得。如果今天密碼欄位沒有加密,就好像是把大筆金額放到沒有功能的保險箱一樣,誰打開誰就能取走。


帳號密碼被竊
曾經看過很多早期設計的系統密碼欄位都還是明碼,說真的,每次看每次都會覺得可怕。總經理與其他主管輸入密碼的時候都非常小心,但有什麼用呢?也許其他員工無法取得其資料庫的內容,甚至連接觸都沒辦法,但資安中最弱的環節並非設定方法、防火牆或政策,而是「人」。

如果管理資料庫的人本身品德不佳,管理人員便可以輕易的進入資料庫管理介面內開啟資料表,輕鬆的複製貼上將密碼偷走。除了企業內部資訊會外洩,甚至如竊取會計的帳號密碼,可以看到每個人的薪資資料以及公司的總帳;竊取研發經理的帳號則可能導致公司的研究成果流出等等狀況。(圖1)

圖1:未經加密的密碼無論使用再怎麼長的強式密碼都是枉然。


經由上述的案例來看,密碼欄位的加密是否就顯得格外重要了呢?下面筆者會說明如何簡單的使用微軟SQL 2005內建的功能,快速的將密碼欄位進行加密。


字串加密函式:HashBytes
HashBytes提供的加密法有幾種,分別為MD2、MD4、MD5、SHA、SHA1,目前最常被使用的是MD5與SHA1。整個使用過程很簡單,只是有一些小細節要注意即可順利達成。首先,先測試HashBytes運作是否合乎需求,這裡先開啟SQL Server Management Studio(SSMS),隨意建立一個測試用的資料庫之後,點選建立好的資料庫,並按下左上角的[新增查詢],再將以下T-SQL語法輸入到查詢視窗中:
---測試 Hashbytes 函式是否有作用
Select hashbytes('MD5','12345') as MD5,
hashbytes('SHA1','12345') as SHA1;


查詢會產生的結果如表1。這樣看來將字串「12345」的加密是已經成功了,也可確定HashBytes函式運作無誤,接下來就可以進行實際導入前的測試。


表1:使用HashBytes 函式對字串「12345」以MD5與SHA1加密的結果



HashBytes應用測試過程

在正式將密碼欄位加密之前,為了慎重起見,讓我們來模擬密碼欄位加密的流程。首先建立一張名稱為[HashTest]的新資料表,欄位設定如表2。我們也可以用以下T-SQL語法快速的建立該資料表:




表2:測試資料表所需欄位型態與說明


資料表建立好後,即可開始進行測試。請在PassWD欄位中隨意輸入一些字串,HashedPW保持空白,因為它是預備用的欄位,也就是接下來要看加密結果是否正確的一個指標。

筆者在這裡輸入的測試資料如表3所示。接下來將需要經由SHA1加密過的密碼字串更新到HashedPW:
--- 將PassWD加密後的值更新至 hashedPW
Update hashtest set hashedPW = HashBytes('SHA1', PassWD)


表3:資料表測試用之資料


HashBytes函式執行結果如表4的亂碼,相信到這裡很多人會想問為什麼跟剛開始的測試結果不一樣呢?


表4:HashedPW加密後的欄位值


根據MSDN上記載,HashBytes函數的回傳值型態為「varbinary」而不是「字串」形態,所以這裡要再使用「sys.fn_VarBinToHexStr()」進行轉換的動作,才可顯示正確的加密字串:
-- 以sys.fn_VarBinToHexStr()轉換成文字
update hashtest set hashedPW = sys.fn_VarBinToHexStr(HashBytes('SHA1', PassWD));

輸出的結果如表5,密碼欄位加密已經正確的完成,接下來還可以用更進階的設置讓我們使用起來更方便。


表5:完整的加密示意圖



加密函式進階應用
文章至此也許會有人會問,能不能讓SQL 2005或2008的加密使用起來跟MySQL一樣,直接用「md5(‘字串’)」或是「sha1(‘字串’)」就可以?免去記憶「sys.fn_VarBinToHexStr()」與「HashBytes()」函式用法的困擾。

其實字串加密函式過程是很固定的,這裡就可以利用Create Function來將上述的過程封裝起來,並且讓使用方法就跟MySQL的加密函式一樣的簡易使用。


封裝MD5加密:Select dbo.MD5('字串' | 欄位名稱),如程式1。


程式1



封裝SHA1加密:Select dbo.SHA1('字串' | 欄位名稱),如程式2。


程式2



後記
在測試完畢後,接下來的工作就是要與程式開發部門的人溝通好,將原本明碼的登入機制稍作修改,就可使用加密過的密碼登入系統了。使用者的習慣完全不用改變,即可讓處理流程更加安全。






【原文刊載於RUN!PC雜誌:2009年1月號】