tft每日頭條

 > 生活

 > md5是常用的數據加密法

md5是常用的數據加密法

生活 更新时间:2025-02-26 05:01:03

我們在書寫SQL腳本時,可能會碰到對字符串進行md5加密的需要,比如存儲在數據庫中的用戶密碼需要進行MD5加密等。大部分數據庫都直接提供了MD5加密函數,比如在MySQL和PostgreSQL中,都直接提供了名稱就是md5的加密函數,着實方便。但在MSSQL中卻并不簡單!

md5是常用的數據加密法(五分鐘玩通使用SQL實現MD5加密)1

MSSQL各版本對MD5加密的處理

使用SQLServer的朋友會發現,在MSSQL中,并沒有名稱類似MD5這樣的函數,如何對字符串進行MD5加密還真不是太容易。特别是在早期版本的,比如MSSQL2000中,要進行MD5加密隻能自己想辦法了,還能有什麼辦法,就是自己寫自定義函數進行處理喽。

如果是在MSSQL2000中進行MD5處理,隻能自己寫自定義函數處理,網上也有一些高手寫好的腳本。我這裡也整理過一個MD5處理的腳本,有需要的朋友可以@網雲技術 找我,我可以私發給您。

可這畢竟不是事兒,不倫不類挺讨厭的。還好從2008開始,MSSQL提供了hashbytes函數,該函數可以對字符串進行MD2、MD4、MD5、SHA、SHA1、SHA2_256、SHA2_512七種算法的加密,可謂不鳴則已一鳴驚人。我們今天就研究下如何使用hashbytes進行md5加密。

md5是常用的數據加密法(五分鐘玩通使用SQL實現MD5加密)2

功能強大的hashbytes函數

hashbytes的語法格式非常簡單:

HASHBYTES ( '算法', expression)

第一個參數就是使用單引号包裹起來的算法名稱,這個名字可以以下七種方式中的任何一種:

MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512

第二個參數就是将要被加密的字符串表達式,可以是常量、變量、表達式或字段等。

返回值是一個最大8000長度的varbinary。沒錯,返回值是varbinary,并不是直接的字符串。下面我們先做個小實驗,對空字符串和字符串'123456'進行MD5加密,看看返回的結果。

select hashbytes('md5',space(0)); select hashbytes('md5','123456');

下圖是執行的結果:

md5是常用的數據加密法(五分鐘玩通使用SQL實現MD5加密)3

查詢結果看上去似乎就是加密後的字符串,但其類型是varbinary,這樣的結果與我們期望的還是存在一定差距的。

結合sys.fn_sqlvarbasetostr轉換為字符串

我們想要的結果,是MD5加密後的字符串,但hashbytes返回的是varbinary,這倒是沒關系,有一個系統函數sys.fn_sqlvarbasetostr是專門用來将varbinary轉為varchar的,當然您可以使用其它方式轉換,既然MSSQL提供了直接轉換的函數,我們就不要多此一舉了。

sys.fn_sqlvarbasetostr的語法格式非常簡單:

sys.fn_sqlvarbasetostr(varbinary)

參數就是varbinary類型的表達式了,返回值則就是varchar類型的字符串。

我們将上述的例子調用sys.fn_sqlvarbasetostr做一下改造:

select sys.fn_sqlvarbasetostr(hashbytes('md5',space(0))); select sys.fn_sqlvarbasetostr(hashbytes('md5','123456'));

運行效果參看下圖:

md5是常用的數據加密法(五分鐘玩通使用SQL實現MD5加密)4

由上圖可以看出,varbinary轉換為varchar類型,大寫也變成了小寫,與我們想要的結果更接近了一步,隻是最前面兩位0x并不是MD5加密後的結果部分,我們還需要使用截取函數将它幹掉。

使用截取函數獲得完整MD5加密結果

說道截取函數,剛好我昨日發文《您最應該掌握的七個SQL字符串處理函數》中,提到的函數中至少有兩個都可以實現該功能,一個就是SUBSTRING、另一個則是stuff。

我們先來看看它們的語法格式。

substring

SUBSTRING(expression,start,length)

stuff

STUFF(expression,start,length,replace)

使用substring最直觀,直接開幹,使用stuff有點迂回,等于是把前兩位挖掉填入空字符串。我們下面綜合運用兩種方式處理下:

select substring(sys.fn_sqlvarbasetostr(hashbytes('md5',space(0))),3,32); select stuff(sys.fn_sqlvarbasetostr(hashbytes('md5','123456')),1,2,space(0));

第一個使用了substring,從第3位截取32位的長度,MD5加密後的字符串就是32位的;第二個使用stuff,從第1位向後挖掉2位,填入空字符串。可謂是殊途同歸。具體結果參看下圖:

md5是常用的數據加密法(五分鐘玩通使用SQL實現MD5加密)5

綜合來說,我們如果要對一個字符串進行MD5加密,完整的語法可以是:

substring(sys.fn_sqlvarbasetostr(hashbytes('md5',待加密字符串)),3,32)

也可以是:

stuff(sys.fn_sqlvarbasetostr(hashbytes('md5',待加密字符串)),1,2,'')

希望對您有所幫助!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved