sqlserver 進行MD5加密


 

官方定義函數:

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. 字符 “è”

image

SQLServer :C05FC85230C60ED8FECB3670E77E603D

結果:與C# gb2312對應

 

2. 字符 “這是漢字”

image

 

SQLServer : E8C9AB48B603F81B87F4ED4F1005BB6E

結果:與C# gb2312對應

 

3. 字符 “123456”

image

 

SQLServer : E10ADC3949BA59ABBE56E057F20F883E

結果:與C# gb2312,utf-8 , utf-7 , ascii  對應

 

4.字符 “pxs123”

image

 

SQLServer : 684D95499489435C9351EFCDD68B25F2

結果:與C# gb2312,utf-8 , utf-7 , ascii  對應

 

4.字符 “pxs!@#.”

image

SQLServer :FC05D7826726E773E993BDCA88F6B181

結果:與C# gb2312,utf-8 , ascii  對應

 

 

5.字符 英文符號“!@#.&*)|_;“

image

SQLServer :4C782D772102482D09696D11BDE1A02A

結果:與C# gb2312,utf-8 , ascii  對應

 

 

 

6.字符 中文英混合符號“《!)*、“

image

SQLServer :1A891B7B5B3285925E2783694C2A367C

結果:與C# gb2312對應

 

6.字符 中文英混合符號“漢字hanzi“

image

SQLServer :49212C24BDB2FA254880119A332F86D6

結果:與C# gb2312對應

 

 

8.字符 “プログラミン“

image

SQLServer :045B556A9CF5F0FE92EC7A7C9B3F66CA

結果:與C# gb2312對應

 

綜上對比:

sqlserver中md5加密函數,字符存在非英文字符會按照gb2312方式編碼計算出加密值,那么C#,JS等計算MD5加密值是就需要轉為gb2312編碼,才能得出一樣的結果。

若為都為英文字符時,用utf-8編輯即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM