转自:https://www.cnblogs.com/JuneZhang/p/7269140.html
前面整理过备忘录,点击查看总结Sql Server内置函数实现MD5加密
实例
MD5加密“123456”:
HashBytes('MD5','123456')
结果:0xE10ADC3949BA59ABBE56E057F20F883E (提示:看完最后,结果要进行转换。)
函数
| 函数 | 描述 | 返回值 |
|
HashBytes |
HashBytes ('加密方式', '待加密的值') 加密方式= MD2 | MD4 | MD5 | SHA | SHA1 |
返回值类型:varbinary(maximum 8000 bytes) |
提示与注释
123456的MD5 有工具可知结果为:e10adc3949ba59abbe56e057f20f883e
HashBytes生成的结果为:0xE10ADC3949BA59ABBE56E057F20F883E,16进制的数值,去掉“0x”转换为小写值就完全与MD5值吻合了,在此需要用另一个函数(sys.fn_sqlvarbasetostr)把varbinary的值转换为varchar类型的,完整sql如下:
select substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','123456')),3,32)
结果就是完整的MD5值:e10adc3949ba59abbe56e057f20f883e
-- =============================================
-- Description: 实现MD5加密算法,返回对字符串的加密结果串
-- =============================================
ALTER FUNCTION MD5
(
@src VARCHAR(255) , -- 源字符串
@type INT = 32 -- 加密类型(16/32),默认值32
)
RETURNS VARCHAR(255)
WITH EXECUTE AS CALLER
AS
BEGIN
-- 存放md5加密串(ox)
DECLARE @smd5 VARCHAR(34)
-- 加密字符串此处用MD5加密,还有一种是SHA1加密
SET @smd5 = sys.fn_VarBinToHexStr(HASHBYTES('MD5', @src));
IF @type = 16
SELECT @smd5 = SUBSTRING(@smd5, 11, 16) --16位
ELSE
SELECT @smd5 = SUBSTRING(@smd5, 3, 32) --32位
-- 返回加密串,转大写
RETURN UPPER(@smd5)
END
可以在UserInfo表中添加一个触发器,当插入和修改用户密码时修改密码为加密后的结构,同时更新到UserInfo表中。
插入和修改时直接明文即可,自动触发加密。
查询时,where条件调用自定义加密方法即可,where uPassword= dob.MD5(@uPassword)
-- =============================================
-- Description: 实现对用户密码进行MD5加密
-- =============================================
alter TRIGGER trg_EncryptPwd ON UserInfo
AFTER INSERT, UPDATE
AS
BEGIN
IF ( UPDATE(uPassword) )
BEGIN
DECLARE @uId dbo.vkey
DECLARE @uPassword VARCHAR(32)
-- 获取用户ID和密码
SELECT @uId = [uId] ,
@uPassword = uPassword
FROM inserted
-- 更新密码
UPDATE UserInfo
SET uPassword = dbo.MD5(@uPassword, 32)
WHERE [uId] = @uId
END
END
GO
