最近,在工作中遇到一個系統整合需求,要求將兩個系統的用戶進行整合,最終實現用戶同步登錄效果。
通過分析發現其中一個系統用戶密碼采用了MD5加密,而另一個系統用戶密碼為明碼存放,為了達到同步登錄的要求首先就需要將用戶資料進行同步,將用戶名和密碼保持一致。
為了實現密碼的一致性,基于安全性的考慮決定將用戶密碼統一進行MD5加密,經過在互聯網上搜索發現了一個函數 hashbytes() ,此函數是微軟在SQL SERVER 2005中提供的,可以用來計算一個字符串的 MD5 和 SHA1 值,使用方法如下:
--
獲取12345的MD5加密串
select
?hashbytes(
'
MD5
'
,?
'
12345
'
)?;
--
獲取12345的SHA1加密串
select
?hashbytes(
'
SHA1
'
,?
'
12345
'
)?;
有了這個函數就可以很容易的對字符串進行加密,但是 hashbytes() 函數的返回結果是 varbinary 型,也就是以 0x 開頭 16 進制形式的二進制數據。通常情況下,我們需要的都是字符串型的數據,很多人首先想到的可能就是用 CAST 或 Convert 函數將varbinary 轉換為 varchar,但這樣轉換后的結果會是亂碼,正確轉換 varbinary 可變長度二進制型數據到 16 進制字符串應該使用系統內置函數 sys.fn_VarBinToHexStr() ,如下所示:
select
?sys.fn_VarBinToHexStr(hashbytes(
'
MD5
'
,?
'
12345
'
))
sys.fn_varBinToHexStr() 函數只在 SQL Server 2005 中有效,在 SQL Server 2000 中實現相同功能使用系統擴展存儲過程: master..xp_varBinToHexStr 。
為了便于使用,我將加密的過程編寫成了一個函數。代碼如下:
--
?=============================================
--
?Author:??????? peterlu
--
?Create?date:?2008-6-11
--
?Description:??實現MD5加密算法,返回對字符串的加密結果串
--
?=============================================
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
最后,采用觸發器的方法,實現對用戶密碼的自動加密。代碼如下:
--
?=============================================
--
?Author:??????? peterlu
--
?Create?date:?2008-6-11
--
?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
通過分析發現其中一個系統用戶密碼采用了MD5加密,而另一個系統用戶密碼為明碼存放,為了達到同步登錄的要求首先就需要將用戶資料進行同步,將用戶名和密碼保持一致。
為了實現密碼的一致性,基于安全性的考慮決定將用戶密碼統一進行MD5加密,經過在互聯網上搜索發現了一個函數 hashbytes() ,此函數是微軟在SQL SERVER 2005中提供的,可以用來計算一個字符串的 MD5 和 SHA1 值,使用方法如下:




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

sys.fn_varBinToHexStr() 函數只在 SQL Server 2005 中有效,在 SQL Server 2000 中實現相同功能使用系統擴展存儲過程: master..xp_varBinToHexStr 。
為了便于使用,我將加密的過程編寫成了一個函數。代碼如下:































最后,采用觸發器的方法,實現對用戶密碼的自動加密。代碼如下:






















更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
