標籤:
官方定義函數:
HashBytes ( ‘<algorithm>‘, { @input | ‘input‘ } )
<algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1
參數解釋:
algorithm:標識用於對輸入執行雜湊操作的雜湊演算法。這是必選參數,無預設值。需要使用單引號。
@input : 資料類型為 varchar、nvarchar 或 varbinary
‘input‘ : 字串資料
傳回值:
varbinary (最大8000位元組)
備忘:允許的輸入值限制為 8000 個位元組。輸出符合演算法標準:MD2、MD4 和 MD5 為 128 位(即 16 個位元組);SHA 和 SHA1 為 160 位(即 20 個位元組)
一:樣本MD5加密:
一個完整的寫法:
PRINT LOWER(RIGHT(sys.fn_varbintohexstr(HASHBYTES(‘MD5‘,‘這個字串需要加密‘)),32)) >> 8926206f9ebb0bee4bbb0724fccb4410
下面逐步拆分
1.先用HashBytes函數看看產生的結果
PRINT HASHBYTES(‘MD5‘,‘這個字串需要加密‘) >> 0x8926206F9EBB0BEE4BBB0724FCCB4410
由於該函數返回的值是二進位varbinary 資料,不是字串不能直接使用,所以要將其轉換為字串
2.用sys.fn_varbintohexstr(@pbinin)
@pbinin : varbinary (max) 資料類型
返回:nvarchar 資料類型
PRINT sys.fn_varbintohexstr(HASHBYTES(‘MD5‘,‘這個字串需要加密‘)) >> 0x8926206f9ebb0bee4bbb0724fccb4410
3.如何得到32位的MD5值,貌似最大也就只能到32位,使用 Right 函數進行截取
PRINT RIGHT(sys.fn_varbintohexstr(HASHBYTES(‘MD5‘,‘這個字串需要加密‘)),32) >> 8926206f9ebb0bee4bbb0724fccb4410
函數定義
RIGHT ( character_expression , integer_expression )
參數:
character_expression :可為字元或位元據運算式,常量,變數,列,任何能隱式轉換為varchar或nvarchar的資料類型(text,ntext需要進行顯示轉換)
integer_expression :正整數,將返回的字元數
傳回值:character_expression 若為 非Unicode 返回 varchar , 若為unicode 則返回nvarchar
4.如果需要統一大小寫 可使用 lower(character_expression ) , upper(character_expression ) 進行轉換
二:關於MD5加密的字元編碼問題
先來幾段對比
1. 字元 “è”
SQLServer :C05FC85230C60ED8FECB3670E77E603D
結果:與C# gb2312對應
2. 字元 “這是漢字”
SQLServer : E8C9AB48B603F81B87F4ED4F1005BB6E
結果:與C# gb2312對應
3. 字元 “123456”
SQLServer : E10ADC3949BA59ABBE56E057F20F883E
結果:與C# gb2312,utf-8 , utf-7 , ascii 對應
4.字元 “pxs123”
SQLServer : 684D95499489435C9351EFCDD68B25F2
結果:與C# gb2312,utf-8 , utf-7 , ascii 對應
4.字元 “[email protected]#.”
SQLServer :FC05D7826726E773E993BDCA88F6B181
結果:與C# gb2312,utf-8 , ascii 對應
5.字元 英文符號“[email protected]#.&*)|_;“
SQLServer :4C782D772102482D09696D11BDE1A02A
結果:與C# gb2312,utf-8 , ascii 對應
6.字元 中文英混合符號“《!)*、“
SQLServer :1A891B7B5B3285925E2783694C2A367C
結果:與C# gb2312對應
6.字元 中文英混合符號“漢字hanzi“
SQLServer :49212C24BDB2FA254880119A332F86D6
結果:與C# gb2312對應
8.字元 “プログラミン“
SQLServer :045B556A9CF5F0FE92EC7A7C9B3F66CA
結果:與C# gb2312對應
綜上對比:
sqlserver中md5加密函數,字元存在非英文字元會按照gb2312方式編碼計算出加密值,那麼C#,JS等計算MD5加密值是就需要轉為gb2312編碼,才能得出一樣的結果。
若為都為英文字元時,用utf-8編輯即可
^若有紕漏之處,歡迎指正!^
sqlserver 進行MD5加密