總結Sql Server內置函數實現MD5加密


--MD5加密
--HashBytes ('加密方式', '待加密的值')
--加密方式= MD2 | MD4 | MD5 | SHA | SHA1    
--返回值類型:varbinary(maximum 8000 bytes)
select HashBytes('MD5','123456')
--HashBytes生成的結果為:0xE10ADC3949BA59ABBE56E057F20F883E

--一般工具生成的都是沒有0x和是小寫的,16進制的數值,去掉“0x”轉換為小寫值就完全與MD5值吻合了,
--在此需要用另一個函數(sys.fn_sqlvarbasetostr)把varbinary的值轉換為varchar類型的,
select sys.fn_sqlvarbasetostr(HashBytes('MD5','123456'))
--結果:0xe10adc3949ba59abbe56e057f20f883e        截取去掉0x

select substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','123456')),3,32)
--結果就是完整的MD5值:e10adc3949ba59abbe56e057f20f883e

 在SQL Server 2005下自帶的函數HashBytes() ,此函數是微軟在SQL Server 2005中提供的,HashBytes() 函數的返回結果是VarBinary類型(以 0x 開頭 16 進制形式的二進制數據)。通常情況下,我們需要的都是字符串型的數據,直接存入varchar字段類型的列或者nvarchar的列,就會出現亂碼,需要類型轉化

--通用可以用convert替換sys.fn_sqlvarbasetostr
select CONVERT(VARCHAR(50),HashBytes('MD5','123456'),1)
--0xE10ADC3949BA59ABBE56E057F20F883E
--如果值不需要0x開頭,可以設置 CONVERT() 的style參數為2
select CONVERT(VARCHAR(50),HashBytes('MD5','123456'),2)

--Convert()函數是Sql Server2008及以上版本支持,2008以下版本可以使用下面的方法:
--sys.fn_VarBinToHexStr() 或 sys.fn_sqlvarbasetostr() 函數轉換也可以避免亂碼,但是轉換后的值帶有0x開頭,並且值為小寫形式
select sys.fn_VarBinToHexStr(HashBytes('MD5','123456'))
--ps. SHA1算法結果為40位,MD5為32位或16位,根據實際長度截取。
--也可使用 fn_varbintohexsubstring() :
SELECT master.dbo.fn_varbintohexsubstring(0,HashBytes('MD5','123456'),1,0)    
--e10adc3949ba59abbe56e057f20f883e
--fn_SqlVarBaseToStr() 第1個參數表示是否保留0x前綴,1為保留,0為不保留。fn_VarBinToHexStr()內部調用的就是fn_SqlVarBaseToStr(),且第1個參數傳的1。

 

--變量類型不同,得到的加密結果也不同
declare @a1 nvarchar(20)
set @a1='123456'
select HashBytes('MD5',@a1)
--0xCE0BFD15059B68D67688884D7A3D3E8C

declare @a2 nvarchar(10)
set @a2='123456'
select HashBytes('MD5',@a2)
--0xCE0BFD15059B68D67688884D7A3D3E8C

declare @a3 varchar(20)
set @a3='123456'
select HashBytes('MD5',@a3)
--0xE10ADC3949BA59ABBE56E057F20F883E

 


免責聲明!

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



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