Mssql MD5加密

内置函数MD5加密

mssql2008r2 内置md5函数 :

HashBytes('MD5','123456') 得到结果 0xE10ADC3949BA59ABBE56E057F20F883E

如果要获取32位MD5,使用substring函数, SUBSTRING(HASHBYTES('md5','123456'),2,32)

实现数据库字段加密

当知道了上面的函数,也不要直接使用,先测试下是否能够得到自己想要的结果

目标:

Users表内Password(nvarchar(100))字段 进行MD5加密

测试:

declare @pwd nvarchar(100)
set @pwd = '123456'
select HASHBYTES('md5',@pwd),HASHBYTES('md5','123456')


发现两个结果不一致,这是由于加密字符串的类型不同导致的。

解决方法:

在加密时先将字段转换为varchar类型,如下

declare @pwd nvarchar(100)
set @pwd = '123456'
select HASHBYTES('md5',Cast(@pwd as varchar(max))),HASHBYTES('md5','123456')

截取MD5:

declare @pwd nvarchar(100)
set @pwd = '123456'
select SUBSTRING(HASHBYTES('md5',Cast(@pwd as varchar(max))),3,32)  as '数据库字段加密出来的结果',SUBSTRING(HASHBYTES('md5','123456'),3,32) as '字符串加密出来的结果'

这根本不是我们想要的结果!这是由于MD5加密后返回的是varbinary类型, 在此需要用另一个函数(sys.fn_sqlvarbasetostr)把varbinary的值转换为varchar类型的

declare @pwd nvarchar(100)
set @pwd = '123456'
select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('md5',Cast(@pwd as varchar(max)))),3,32)  as '数据库字段加密出来的结果',SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('md5','123456')),3,32) as '字符串加密出来的结果'

最终处理:

解决了上面的问题后,直接使用来更新数据库

update Users set [Password] = substring(sys.fn_sqlvarbasetostr(HashBytes('MD5',cast([Password] as varchar(max)))),3,32)



你可能感兴趣的:(SQL)