ASP網(wǎng)站用戶帳號的MD5加密技術(shù)
在使用ASP建立站點的過程中,我們通常需要建立一個用戶登錄口,方便用戶登錄并獲取相應(yīng)的用戶權(quán)限,根據(jù)現(xiàn)在的常用技術(shù)實現(xiàn)方法,可以在數(shù)據(jù)庫中建立一個用于存放用戶信息的表(USER_MESSAGE),這個表中至少包括用戶賬號:Username和用戶密碼,Password,當用戶登錄或者提交資料的時候,程序?qū)⒂脩籼顚懙男畔⑴cUSER_MESSAGE表中的信息對照,如果User-name和Password都準確無誤,那么說明這個用戶是合法的。但是這樣的帳號加密系統(tǒng)太簡單、太脆弱了,那么我們今天將給大家介紹一種更新,安全性更好的加密技術(shù):MD5加密技術(shù)。
一、MD5加密技術(shù)原理
1、MD5加密技術(shù)原理
現(xiàn)階段,我們一般認為存在兩種加密方式,單向加密和雙向加密(如圖所示)。

雙向加密是加密算法中最常用的,它將我們可以直接理解的明文數(shù)據(jù)文件加密為我們不可直接理解的密文數(shù)據(jù),然后,在需要的時候,可以使用一定的算法將這些加密以后的密文解密為原來可以理解的明文。雙向加密適合于隱秘通訊,比如,我們在網(wǎng)上購物的時候,需要向網(wǎng)站提交信用卡密碼,我們當然不希望我們的數(shù)據(jù)直接在網(wǎng)上明文傳送,因為這樣很可能被別的用戶“偷聽”,我們希望我們的信用卡密碼是通過加密以后,再在網(wǎng)絡(luò)傳送,這樣,網(wǎng)站接受到我們的數(shù)據(jù)以后,通過解密算法就可以得到準確的信用卡賬號。
單向加密剛好相反,只能對數(shù)據(jù)進行加密,也就是說,沒有辦法對加密以后的數(shù)據(jù)進行解密。這樣的加密有什么用處?不能解密的加密算法有什么作用呢?在實際中的一個應(yīng)用就是數(shù)據(jù)庫中的用戶信息加密,當用戶創(chuàng)建一個新的賬號或者密碼,他的信息不是直接保存到數(shù)據(jù)庫,而是經(jīng)過一次加密以后再保存,這樣,即使這些信息被泄露,也不能立即理解這些信息的真正含義。
2、MD5加密主要特征
MD5加密是采用單向加密的加密算法,對于MD5而言,有兩個特性是很重要的,第一是任意兩段明文數(shù)據(jù),加密以后的密文不能是相同的;第二是任意一段明文數(shù)據(jù),經(jīng)過加密以后,其結(jié)果必須永遠是不變的。前者的意思是不可能有任意兩段明文加密以后得到相同的密文,后者的意思是如果我們加密特定的數(shù)據(jù),得到的密文一定是相同的。
3、MD5模型結(jié)構(gòu)
MD5CyptoServiceProvider類是.NET中System.Security.Cryp-tography名字空間的一個類,提供專門用于MD5單向數(shù)據(jù)加密的解決方法,也是用來加密數(shù)據(jù)庫中密碼的類。MD5CyptoServiceProvider類中的主要方法:ComputeHash,它將輸入的明文數(shù)據(jù)數(shù)組使用MD5加密以后輸出加密后的密文數(shù)據(jù)數(shù)組。ComputeHash方法只能接受數(shù)組作為加密對象,輸出的密文也是數(shù)組,因此,在對字符串加密之前,我們必須首先將這些字符串轉(zhuǎn)化為數(shù)組,將字符串轉(zhuǎn)化為數(shù)組,而加密以后的結(jié)果也是使用數(shù)組輸出。
現(xiàn)在,我們就來看一個具體的實例:
'要加密的明文字符串
DimstrPlainTextasString=Encryptme!
'用于存放明文字符串的數(shù)組
DimhashedDataBytesasByte()
DimencoderasNewUTF8Encoding()
'建立MD5CryptoService實例
Dimmd5HasherasNewMD5CryptoServiceProvider()
'加密運算
hashedDataBytes=md5Hasher.ComputeHash(encoder.GetBytes(strPlainText))
二、MD5加密技術(shù)具體編程應(yīng)用
1、建立一個MD5加密賬號
網(wǎng)站往往將用戶的賬號、密碼等信息使用非加密的方式保存到數(shù)據(jù)庫,比如賬號使用類型為VarChar的Username字段,同樣,密碼也是采用類型為VarChar的Password字段。采用MD5加密方式存儲密碼信息,就必須改變密碼字段PassWord的類型為16為二進制方式,因為加密以后的輸出,是使用二進制數(shù)組的,必須做相應(yīng)的改變。以下的程序代碼實現(xiàn)了建立一個賬號的功能,在頁面中,程序要求用戶輸入賬號、密碼等信息,然后,將這些信息作為賬號信息存入名為USER_MESSAGE的數(shù)據(jù)表,在這個表中,用戶密碼是使用MD5加密保存的。下面就是實現(xiàn)以上頁面的具體代碼:
<scriptlanguage=VBScript>
'建立用戶信息提交函數(shù)
SubCreateAccount()
'建立數(shù)據(jù)庫連接
ConststrConnStringasString=connectionstringDimobjConnasNewSqlConnection(strConnString)
'建立Command對象
DimstrSQLasString=_INSERTINTOUSER_MESSAGE(Username,Password)&_VALUES(@Username,@Password)
DimobjCmdasNewSqlCommand(strSQL,objConn)
'SQL參數(shù)
DimparamUsernameasSqlParameter
paramUsername=NewSqlParameter(@Username,SqlDbType.VarChar,25)
paramUsername.Value=txtUsername.TextobjCmd.Parameters.Add(paramUsername)
'加密用戶密碼
Dimmd5HasherasNewMD5CryptoServiceProvider()DimhashedBytesasByte()
DimencoderasNewUTF8Encoding()
hashedBytes=md5Hasher.ComputeHash(encoder.GetBytes(txtP-wd.Text))
DimparamPwdasSqlParameter
paramPwd=NewSqlParameter(@Password,SqlDbType.Bina-ry,16)
paramPwd.Value=hashedBytes
objCmd.Parameters.Add(paramPwd)'加入數(shù)據(jù)庫objConn.Open()
objCmd.ExecuteNonQuery()
objConn.Close()EndSub</script>
'提交表單內(nèi)容
<formrunat=server><h1>建立一個賬號</h1>
用戶名:<asp:TextBoxrunat=serverid=txtUsername/><br/>密碼:
<asp:TextBoxrunat=serverid=txtPwdTextMode=Pass-word/>
<p><asp:Buttonrunat=serverText=建立用戶賬號OnClick=CreateAccount()/></p>
</form>
2、MD5加密賬號的確認
我們知道,MD5是單次加密算法,不可能將加密以后的信息轉(zhuǎn)為明文,也就是說,已經(jīng)沒有辦法知道用戶密碼到底是什么。如果用戶使用賬號、密碼登錄,怎么知道用戶提供的密碼是否準確呢?根據(jù)MD5的特征,任意一段明文數(shù)據(jù),經(jīng)過加密以后,其結(jié)果必須永遠是不變的,只需要將用戶當前提供的密碼使用MD5加密,然后和數(shù)據(jù)庫中保存的密碼字段比較就可以了。下面就是實現(xiàn)以上頁面的具體代碼:
'建立Command對象
<scriptlanguage=VBScript>
'建立用戶登錄函數(shù)SubLogin()
'建立數(shù)據(jù)庫連接
ConststrConnStringasString=connectionstringDimobjConnasNewSqlConnection(strConnString)
'建立Command對象
DimstrSQLasString=SELECTCOUNT(*)FROMUS-ER_MESSAGE&_
WHEREUsername=@UsernameANDPassword=@Password'SQL參數(shù)
DimparamUsernameasSqlParameter
paramUsername=NewSqlParameter(@Username,SqlDbType.VarChar,25)
paramUsername.Value=txtUsername.TextobjCmd.Parameters.Add(paramUsername)
'加密密碼信息
Dimmd5HasherasNewMD5CryptoServiceProvider()DimhashedDataBytesasByte()
DimencoderasNewUTF8Encoding()
hashedDataBytes=md5Hasher.ComputeHash(encoder.GetBytes(txtPwd.Text))
DimparamPwdasSqlParameter
paramPwd=NewSqlParameter(@Password,SqlDbType.Bina-ry,16)
paramPwd.Value=hashedDataBytesobjCmd.Parameters.Add(paramPwd)objConn.Open()
DimiResultsasInteger=objCmd.ExecuteScalar()objConn.Close()IfiResults=1then
'正確Else'錯誤
EndIfEndSub<//script>
<formrunat=server>
<h1>登錄</h1>
用戶賬號:<asp:TextBoxrunat=serverid=txtUsername/>
<br/>密碼:
<asp:TextBoxrunat=serverid=txtPwdTextMode=Pass-word/>
<p><asp:Buttonrunat=serverOnClick=Login()/>
</form>
MD5加密技術(shù)中是單向加密,PassWord字段的信息是以二進制方式保存的,即使數(shù)據(jù)庫被人取得,也不可能知道密碼具體是什么意思,密碼也就不會泄露,所以是一種可靠網(wǎng)站用戶帳號的加密技術(shù)。由于它容易使用、性能好,而且提供了在Internets上的良好接口,對網(wǎng)站的應(yīng)用開發(fā)提供了極大的便利。
小知識之MD5加密
MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest開發(fā)出來,經(jīng)MD2、MD3和MD4發(fā)展而來。










