日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

使用SQL2005自帶擴(kuò)展函數(shù)對(duì)字符串進(jìn)行MD5加密

系統(tǒng) 1991 0
最近,在工作中遇到一個(gè)系統(tǒng)整合需求,要求將兩個(gè)系統(tǒng)的用戶進(jìn)行整合,最終實(shí)現(xiàn)用戶同步登錄效果。
通過分析發(fā)現(xiàn)其中一個(gè)系統(tǒng)用戶密碼采用了MD5加密,而另一個(gè)系統(tǒng)用戶密碼為明碼存放,為了達(dá)到同步登錄的要求首先就需要將用戶資料進(jìn)行同步,將用戶名和密碼保持一致。
為了實(shí)現(xiàn)密碼的一致性,基于安全性的考慮決定將用戶密碼統(tǒng)一進(jìn)行MD5加密,經(jīng)過在互聯(lián)網(wǎng)上搜索發(fā)現(xiàn)了一個(gè)函數(shù) hashbytes() ,此函數(shù)是微軟在SQL SERVER 2005中提供的,可以用來計(jì)算一個(gè)字符串的 MD5 和 SHA1 值,使用方法如下:

-- 獲取12345的MD5加密串
select ?hashbytes( ' MD5 ' ,? ' 12345 ' )?;
-- 獲取12345的SHA1加密串
select ?hashbytes( ' SHA1 ' ,? ' 12345 ' )?;

有了這個(gè)函數(shù)就可以很容易的對(duì)字符串進(jìn)行加密,但是 hashbytes() 函數(shù)的返回結(jié)果是 varbinary 型,也就是以 0x 開頭 16 進(jìn)制形式的二進(jìn)制數(shù)據(jù)。通常情況下,我們需要的都是字符串型的數(shù)據(jù),很多人首先想到的可能就是用 CAST 或 Convert 函數(shù)將varbinary 轉(zhuǎn)換為 varchar,但這樣轉(zhuǎn)換后的結(jié)果會(huì)是亂碼,正確轉(zhuǎn)換 varbinary 可變長度二進(jìn)制型數(shù)據(jù)到 16 進(jìn)制字符串應(yīng)該使用系統(tǒng)內(nèi)置函數(shù) sys.fn_VarBinToHexStr() ,如下所示:

select ?sys.fn_VarBinToHexStr(hashbytes( ' MD5 ' ,? ' 12345 ' ))

sys.fn_varBinToHexStr() 函數(shù)只在 SQL Server 2005 中有效,在 SQL Server 2000 中實(shí)現(xiàn)相同功能使用系統(tǒng)擴(kuò)展存儲(chǔ)過程: master..xp_varBinToHexStr 。

為了便于使用,我將加密的過程編寫成了一個(gè)函數(shù)。代碼如下:

-- ?=============================================
--
?Author:??????? peterlu
--
?Create?date:?2008-6-11
--
?Description:??實(shí)現(xiàn)MD5加密算法,返回對(duì)字符串的加密結(jié)果串
--
?=============================================
ALTER ? FUNCTION ? [ dbo ] . [ MD5 ] ?
(
????
-- ?源字符串
???? @src ? varchar ( 255 ),
????
-- ?加密類型(16/32)
???? @type ? int ? = ? 32
)
RETURNS ? varchar ( 255 )
WITH ? EXECUTE ? AS ?CALLER
AS
BEGIN
????
-- ?存放md5加密串(ox)
???? DECLARE ? @smd5 ? varchar ( 34 )

????
-- ?加密字符串
???? 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

最后,采用觸發(fā)器的方法,實(shí)現(xiàn)對(duì)用戶密碼的自動(dòng)加密。代碼如下:

-- ?=============================================
--
?Author:??????? peterlu
--
?Create?date:?2008-6-11
--
?Description:??實(shí)現(xiàn)對(duì)用戶密碼進(jìn)行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

使用SQL2005自帶擴(kuò)展函數(shù)對(duì)字符串進(jìn)行MD5加密


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 肃北| 广东省| 平泉县| 措美县| 旬邑县| 浦北县| 淅川县| 清涧县| 鸡西市| 龙口市| 漳平市| 南京市| 廉江市| 广水市| 长岛县| 海晏县| 望都县| 尖扎县| 霍山县| 武威市| 南涧| 宁蒗| 宝山区| 岳普湖县| 玉环县| 屏东县| 逊克县| 鲜城| 招远市| 弥勒县| 库尔勒市| 陆丰市| 玉溪市| 杭锦旗| 乌兰察布市| 微山县| 广水市| 康平县| 山阳县| 桓台县| 海口市|