如何加密資料庫中的資料
若想要對SQL中的資料加密,從 SQL 2005版本開始,可以使用內建函式 HashBytes 來進行 Hash 的功能操作。其語法如下:
HashBytes ( '<algorithm>', { @input | 'input' } )
<algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1
</pre>
</div>
<div class="source_code"><pre class="brush:sql;" title="使用 HashBytes 將資料加密">
Declare @password nvarchar(50)
Set @password='abc123'
SELECT HashBytes('MD5',@password) AS MD5
--0x6e9b3a7620aaf77f362775150977eeb8
不過要注意的是,這個函式的回傳值是一個varbinary型別。 所以,若直接以這個回傳值回寫到資料庫去,將來也就無法直接使用。例如:
UPDATE tblUser SET HashedPwd = HashBytes('MD5',Pwd)
其結果如下:
| Row | Pwd | HashedPwd |
|---|---|---|
| 1 | 12345678 | 갩春『ま펗⺂흐 |
| 2 | abcd123 | 驴륾㤺ਲ䔯䲼줸꓆ |
| 3 | helloword | 㝪㕡䮱ꚯ䊏༭菵鳻 |
若要取回字串的型態,可以使用 sys.fn_VarBinToHexStr() 進行轉換,例如:
UPDATE tblUser SET HashedPwd = sys.fn_VarBinToHexStr(HashBytes('MD5',Pwd))
這樣子結果就正常了:
| Row | Pwd | HashedPwd |
|---|---|---|
| 1 | 12345678 | 0x29ac25660e3078e87e3097d3822e50d7 |
| 2 | abcd123 | 0x749a7eb93a39320a2f45bc4c38c9c6a4 |
| 3 | helloword | 0x6a376135b14bafa68f422d0ff583fb9c |
若 HashBytes 用在加密使用者密碼,使用上必須注意以下事項:
- 登入時的查詢語法,要有所變動,例如:
declare @password nvarchar(50) set @password='abcd123' SELECT * FROM tblUser WHERE HashedPwd = sys.fn_VarBinToHexStr(HashBytes('MD5',@password)) - 針對密碼欄位的變更,可以加一個觸發程序,將明碼的資料,透過 HashBytes 轉成暗碼的資料,這樣就不用變動到程式碼的部份。
CREATE TRIGGER [dbo].[trg_EncryptPwd] ON [dbo].[tblUser] AFTER INSERT, UPDATE AS BEGIN IF(UPDATE(HashedPwd)) BEGIN UPDATE tblUser SET tblUser.HashedPwd = sys.fn_VarBinToHexStr(hashbytes('MD5', cast(inserted.HashedPwd as nvarchar(50)))) FROM tblUser, inserted WHERE tblUser.UserID=inserted.UserID END END
HashBytes 用法補充
1. 多個欄位 checksum
SELECT CustomerKey,
HashBytes('MD5',
MaritalStatus +
CountryRegion
) AS HashBytesValue
From DimCustomers
2. 不支援 NULL
SELECT CustomerKey,
HashBytes('MD5',
IsNull(MaritalStatus,'') +
IsNull(CountryRegion,'')
) AS HashBytesValue
From DimCustomers
3. 只支援字串型別
SELECT CustomerKey,
HashBytes('MD5',
IsNull(MaritalStatus,'') +
IsNull(CountryRegion,'') +
Cast(IsNull(BirthDate, '1911/1/1') as varchar)
) AS SCD_Columns
From DimCustomers
沒有留言:
張貼留言