• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
June's New World
知识和经验都是一点点积累的!现在努力也不晚,June加油!
博客园    首页    新随笔    联系   管理    订阅  订阅
Sql Server内置函数实现MD5加密

前面整理过备忘录,点击查看总结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

 

posted on 2017-08-01 16:17  冬雨在路上  阅读(6775)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3