在使用ASP建立站点的过程中,我们通常需要建立一个用户登录口,方便用户登录并获取相应的用户权限,根据现在的常用技术实现方法,可以在数据库中建立一个用于存放用户信息的表(USER_MESSAGE),这个表中至少包括用户账号:Username和用户密码,Password,当用户登录或者提交资料的时候,程序将用户填写的信息与USER_MESSAGE表中的信息对照,如果User-name和Password都准确无误,那么说明这个用户是合法的。但是这样的帐号加密系统太简单、太脆弱了,那么我们今天将给大家介绍一种更新,安全性更好的加密技术:MD5加密技术。

一、MD5加密技术原理

1、MD5加密技术原理

现阶段,我们一般认为存在两种加密方式,单向加密和双向加密(如图所示)。

ASP网站用户帐号的MD5加密技术

双向加密是加密算法中最常用的,它将我们可以直接理解的明文数据文件加密为我们不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文。双向加密适合于隐秘通讯,比如,我们在网上购物的时候,需要向网站提交信用卡密码,我们当然不希望我们的数据直接在网上明文传送,因为这样很可能被别的用户“偷听”,我们希望我们的信用卡密码是通过加密以后,再在网络传送,这样,网站接受到我们的数据以后,通过解密算法就可以得到准确的信用卡账号。

单向加密刚好相反,只能对数据进行加密,也就是说,没有办法对加密以后的数据进行解密。这样的加密有什么用处?不能解密的加密算法有什么作用呢?在实际中的一个应用就是数据库中的用户信息加密,当用户创建一个新的账号或者密码,他的信息不是直接保存到数据库,而是经过一次加密以后再保存,这样,即使这些信息被泄露,也不能立即理解这些信息的真正含义。

2、MD5加密主要特征

MD5加密是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。

3、MD5模型结构

MD5CyptoServiceProvider类是.NET中System.Security.Cryp-tography名字空间的一个类,提供专门用于MD5单向数据加密的解决方法,也是用来加密数据库中密码的类。MD5CyptoServiceProvider类中的主要方法:ComputeHash,它将输入的明文数据数组使用MD5加密以后输出加密后的密文数据数组。ComputeHash方法只能接受数组作为加密对象,输出的密文也是数组,因此,在对字符串加密之前,我们必须首先将这些字符串转化为数组,将字符串转化为数组,而加密以后的结果也是使用数组输出。

现在,我们就来看一个具体的实例:

'要加密的明文字符串

DimstrPlainTextasString=Encryptme!

'用于存放明文字符串的数组

DimhashedDataBytesasByte()

DimencoderasNewUTF8Encoding()

'建立MD5CryptoService实例

Dimmd5HasherasNewMD5CryptoServiceProvider()

'加密运算

hashedDataBytes=md5Hasher.ComputeHash(encoder.GetBytes(strPlainText))

二、MD5加密技术具体编程应用

1、建立一个MD5加密账号

网站往往将用户的账号、密码等信息使用非加密的方式保存到数据库,比如账号使用类型为VarChar的Username字段,同样,密码也是采用类型为VarChar的Password字段。采用MD5加密方式存储密码信息,就必须改变密码字段PassWord的类型为16为二进制方式,因为加密以后的输出,是使用二进制数组的,必须做相应的改变。以下的程序代码实现了建立一个账号的功能,在页面中,程序要求用户输入账号、密码等信息,然后,将这些信息作为账号信息存入名为USER_MESSAGE的数据表,在这个表中,用户密码是使用MD5加密保存的。下面就是实现以上页面的具体代码:

<scriptlanguage=VBScript>

'建立用户信息提交函数

SubCreateAccount()

'建立数据库连接

ConststrConnStringasString=connectionstringDimobjConnasNewSqlConnection(strConnString)

'建立Command对象

DimstrSQLasString=_INSERTINTOUSER_MESSAGE(Username,Password)&_VALUES(@Username,@Password)

DimobjCmdasNewSqlCommand(strSQL,objConn)

'SQL参数

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)'加入数据库objConn.Open()

objCmd.ExecuteNonQuery()

objConn.Close()EndSub</script>

'提交表单内容

<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是单次加密算法,不可能将加密以后的信息转为明文,也就是说,已经没有办法知道用户密码到底是什么。如果用户使用账号、密码登录,怎么知道用户提供的密码是否准确呢?根据MD5的特征,任意一段明文数据,经过加密以后,其结果必须永远是不变的,只需要将用户当前提供的密码使用MD5加密,然后和数据库中保存的密码字段比较就可以了。下面就是实现以上页面的具体代码:

'建立Command对象

<scriptlanguage=VBScript>

'建立用户登录函数SubLogin()

'建立数据库连接

ConststrConnStringasString=connectionstringDimobjConnasNewSqlConnection(strConnString)

'建立Command对象

DimstrSQLasString=SELECTCOUNT(*)FROMUS-ER_MESSAGE&_

WHEREUsername=@UsernameANDPassword=@Password'SQL参数

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加密技术中是单向加密,PassWord字段的信息是以二进制方式保存的,即使数据库被人取得,也不可能知道密码具体是什么意思,密码也就不会泄露,所以是一种可靠网站用户帐号的加密技术。由于它容易使用、性能好,而且提供了在Internets上的良好接口,对网站的应用开发提供了极大的便利。

小知识之MD5加密

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。