前面整理過備忘錄,點擊查看總結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
