注意:
hashbytes()返回varbinary類型值;
sys.fn_VarBinToHexStr()是把varbinary轉換成varchar;
具體使用方式如下:
-- =============================================
-- Description: 實現MD5密碼編譯演算法,返回對字串的加密結果串
-- =============================================
CREATE FUNCTION MD5
(
-- 源字串
@src varchar(255),
-- 加密類型(16/32)
@type int = 32
)
RETURNS varchar(255)
WITH EXECUTE AS CALLER
AS
BEGIN
-- 存放md5加密串(ox)
DECLARE @smd5 varchar(34)
-- 加密字串此處用MD5加密,還有一種是SHA1加密
SELECT @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 @smd5
END
加密時使用
建立一個users表以供測試用:
CREATE TABLE [dbo].[Users](
[UserID] [int] NULL,
[Password] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL
)
對users表添加一個觸發器,當插入和修改使用者密碼時修改密碼為加密後的結構,同時更新到users表中
-- =============================================
-- Description: 實現對使用者密碼進行MD5加密
-- =============================================
CREATE TRIGGER trg_EncryptPwd
ON Users
AFTER INSERT,UPDATE
AS
BEGIN
IF(UPDATE(Password))
BEGIN
DECLARE @uid int
DECLARE @pwd varchar(32)
-- 擷取使用者ID和密碼
SELECT @uid=UserID,@pwd=Password FROM inserted
-- 更新密碼
UPDATE Users SET Password = dbo.MD5(@pwd,16) WHERE UserID = @uid
END
END
GO
如果我插入一條資料:
insert into users values(123,'12345')
則在資料庫庫中出現了加密後的結果,但是如果想測試查詢一下,可以使用如下的方式:
select * from users where password=dbo.MD5('12345',16)
同樣是用加密函數再次加密一下就可以與表中的資料對應