從Sql2008開始,MSSQL提供了hashbytes函數,該函數可以對字符串進行MD2、MD4、MD5、SHA、SHA1、SHA2_256、SHA2_512七種算法的加密
1.使用hashbytes函數進行加密的語法格式:
HASHBYTES ( '算法', expression)
第一個參數就是使用單引號包裹起來的算法名稱,這個名字可以以下七種方式中的任何一種:
MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512
第二個參數就是將要被加密的字符串表達式,可以是常量、變量、表達式或字段等。
--例如:密碼是 123456
select HashBytes('MD5','123456')
輸出:0xE10ADC3949BA59ABBE56E057F20F883E
返回值是一個最大8000長度的varbinary。沒錯,返回值是varbinary,並不是直接的字符串
我們想要的結果,是MD5加密后的字符串,但hashbytes返回的是varbinary,這倒是沒關系,有一個系統函數sys.fn_sqlvarbasetostr是專門用來將varbinary轉為varchar的,當然您可以使用其它方式轉換,既然MSSQL提供了直接轉換的函數
2.使用sys.fn_sqlvarbasetostr函數轉換的語法格式:
sys.fn_sqlvarbasetostr(varbinary)
參數就是varbinary類型的表達式了,返回值則就是varchar類型的字符串。
--例如:密碼是 123456 的MD5轉換為 Varchar 類型
select sys.fn_sqlvarbasetostr(HashBytes('MD5','123456'))
輸出:0xe10adc3949ba59abbe56e057f20f883e
結果,是varbinary轉換為varchar類型,大寫也變成了小寫,但加密的數值前面兩位0x並不是MD5加密后的結果部分,我們還需要使用截取函數將它去掉,獲得完整MD5加密結果,
函數中有兩個都可以實現該功能,一個就是substring、另一個則是stuff。
3.1使用 Substring函數截取的語法格式
SUBSTRING(expression,start,length)
第一參數就是字符串表達式,可以是常量、變量、表達式或字段等
第二個參數是截取的開始位數
第三個參數是截取的長度位數
--例如:密碼是 123456 的MD5轉換為 Varchar 類型,並從第3位開始截取出32位字符
select SUBSTRING( sys.fn_sqlvarbasetostr(HashBytes('MD5','123456')),3,32)
輸出:e10adc3949ba59abbe56e057f20f883e
3.2 使用Stuff函數截取的語法格式(使用stuff等於是把前兩位挖掉填入空字符串)
STUFF(expression,start,length,replace)
第一參數就是字符串表達式,可以是常量、變量、表達式或字段等
第二個參數是截取的開始位數
第三個參數是截取的長度位數
第四個參數是替換的字符串內容
--例如:密碼是 123456 的MD5轉換為 Varchar 類型,並從第1位開始截取到2位字符替換成空格(space(0) 里面的0 表示沒有空格,如是其他數值則表示增加對應數值的空格替換)
select Stuff( sys.fn_sqlvarbasetostr(HashBytes('MD5','123456')),1,2,SPACE(2))
綜上操作,我們如果要對一個字符串進行MD5加密就完成了。