当前位置:文档之家› 浅谈使用MD5算法加密数据(完整版)

浅谈使用MD5算法加密数据(完整版)

浅谈使用MD5算法加密用户密码一、引言最近看了媒体的一篇关于“网络上公开叫卖个人隐私信息”报导,不法分子通过非法手段获得的个人隐私信息,其详细、准确程度简直令人瞠口结舌。

在互联网飞速发展的现在,我们不难想到,网络肯定是传播这些个人隐私信息的重要途径之一。

现在网络上一般的网站,只要稍微完善一点的,都需要用户进行注册,提供诸如用户名、用户密码、电子邮件、甚至是电话号码、详细住址等个人隐私信息,然后才可以享受网站提供的一些特殊的信息或者服务。

比如电子商务网站,用户需要购买商品,就一定需要提供详细而准确的信息,而这些信息,往往都是用户的隐私信息,比如电子邮件、电话号码、详细住址等。

所以,用户注册的信息对于用户和网站来说都是很重要的资源,不能随意公开,当然也不能存在安全上的隐患。

用户注册时,如果将用户资料直接保存在数据库中,而不施加任何的保密措施,对于一些文件型数据库(如Access),如果有人得到这个数据库文件,那这些资料将全部泄露。

再有,如果遇到一个不负责任的网管,则不需要任何技术手段,他就可以查看到用户的任何资料。

所以,为了增加安全性,我们有必要对数据库中的隐私数据进行加密,这样,即使有人得到了整个数据库,如果没有解密算法,也一样不能查看到用户的隐私信息。

但是,在考虑数据库是否安全之前,有必要对这些数据是否真的那么重要进行考虑,如果数据并不重要,则没有保密的必要,否则将会浪费系统资源、加重程序负担。

反之,如果数据具有一定的隐私性,则必须进行加密。

因此,在考虑加密以前,应该对数据是否需要加密做出选择,以免浪费系统资源或者留下安全隐患。

二、MD5算法简介MD5算法,即“Message-Digest Algorithm 5(信息-摘要算法)”,它是由MD2、MD3、MD4发展而来的一种单向函数算法,也就是哈希(HASH)算法,是由国际著名的公钥加密算法标准RSA的第一设计者R.Rivest于上个世纪90年代初开发出来的。

加密算法一般有两种,即单向加密算法和双向加密算法。

双向加密是加密算法中最常用的,它将可以直接理解的明文数据加密为不可直接理解的密文数据,在需要的时候,又可以使用一定的算法将这些加密以后的密文数据解密为原来的明文数据。

双向加密适合于隐秘通号、信用卡密码等信息,应当通过双向加密算法加密以后,再在网络上传输,这样,可以有效的防止黑客的“偷听”,保证数据的安全,同时,网站接收到我们的数据以后,可以通过解密算法来获得准确的信息。

双向加密既可以加密,又可以解密。

而单向加密则刚好相反,它只能对明文数据进行加密,而不能对加密了的密文数据再解密成原来的明文数据。

可能读者会认为,不能解密的加密算法有什么作用呢?在实际应用中,对软件系统数据库中的系统用户信息(如用户密码)加密,就是一个典型的例子。

当用户注册一个新的账号时,其用户密码信息不是直接保存到数据库,而是经过单向加密后再保存,这样,即使这些账号信息被泄露,别人也不能得到相应的用户密码,当然也就达不到盗窃账号的目的。

MD5算法就是单向加密的加密算法。

它有两个很重要的特性,第一是任意两段明文数据,加密以后的密文数据一定是不相同的;第二是任意一段明文数据,经过加密以后,其密文数据永远是相同的。

三、在C# 中使用MD5算法加密用户密码为了更好的说明MD5算法的实际应用,下面用一个实例来进行介绍。

该实例使用MD5算法加密软件系统的系统用户密码。

该实例用到的软件有:⏹Microsoft SQL Server 2000⏹Microsoft Visual Studio 2005本实例使用C# 语言开发,并采用Windows应用程序的形式给出。

具体的实现方法和步骤如下:(1)使用Microsoft SQL Server 2000创建一个名为“DBMD5”数据库,并在“DBMD5”数据库中创建一个名为“tbl_User”的数据表,数据表的结构如下表所示(非本文重点,不作具体介绍)。

(2)使用Microsoft Visual Studio 2005创建一个名为“UseMd5”的Visual C# Windows 应用程序,并将默认的窗体界面设计成如下图所示。

(3)窗体和窗体中的各对象属性设置如下表所示。

(4)接下来引入几个命名空间,定义公共变量和对象,并编写一个用于加密数据的公共方法。

首先引入以下两个命名空间,其中“System.Data.SqlClient”是访问SQL数据库所需的,而“System.Security.Cryptography”则包含了与MD5算法相关的类。

// ******************************************************************************************************** using System.Data.SqlClient;using System.Security.Cryptography;// ********************************************************************************************************然后定义以下公共变量和对象,其中静态字符串变量“connStr”用于指定数据库连接字符串,“conn”是SQL数据库连接对象。

public string connStr = "server=服务器名称;database=数据库名称;integrated security=SSPI";SqlConnection conn = new SqlConnection(connStr);// ********************************************************************************************************接下来编写一个名为“GetMd5Str()”的方法,并给该方法定义一个字符串类型的形式参数“myString”,该方法用来将指定的字符串“myString”使用MD5算法进行加密,并返回加密后的密文数据字符串。

// ******************************************************************************************************** public string GetMd5Str(string myString){MD5 md5 = new MD5CryptoServiceProvider();byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);byte[] toData = puteHash(fromData);string byteStr = null;for (int i = 0; i < toData.Length; i++){byteStr += toData[i].ToString("x");}return byteStr.Substring(0, 32);}// ********************************************************************************************************上述代码中,“MD5CyptoServiceProvider”类是.NET中“System.Security.Cryptography”命名空间的一个类,提供专门用于MD5单向数据加密的解决方法,也是本文中用来加密数据库中用户密码的类。

在使用“GetMd5Str()”方法进行数据加密之前,我们首先来了解“MD5CyptoServiceProvider”类的主要方法:ComputeHash()方法。

ComputeHash()方法用来将输入的明文数据字符数组使用MD5进行加密,然后输出加密后的密文数据字符数组。

在“GetMd5Str()”方法中:要加密的明文字符串为“myString”;用于存放明文字符串的字符数组为“fromData”;用于接收密文数据的字符数组为“toData”;方法的返回值为密文字符串“byteStr”的前32位。

可以看出,“ComputeHash()”方法只能接受数组作为加密对象,输出的密文也是数组,因此,在对字符串加密之前,我们必须首先将字符串转化为字符数组,这就要用到“Encoding”类的GetBytes方法,将字符串转化为字符数组,而加密以后的结果也是使用字符数组输出。

(5)编写【取消】按钮的单击事件代码当用户单击【取消】按钮时,即终止登录操作,并关闭登录界面,因此需要编写【取消】按钮的单击事件代码如下:// ******************************************************************************************************** private void btnCancel_Click(object sender, EventArgs e){Application.Exit();}// ********************************************************************************************************(6)编写【注册】按钮的单击事件代码当用户注册用户账号时,数据库中就需要为这个用户增加一条相应的记录。

下面的程序代码实现了创建一个账号的功能,只要用户输入用户名、用户密码信息后单击【注册】按钮,就可以将这些信息存入到“DBMD 5”数据库的“tbl_User”数据表中,在这个表中,用户密码是使用MD5加密保存的。

具体的代码如下:private void btnRegedit_Click(object sender, EventArgs e){try{if (txtId.Text.Trim() == ""){MessageBox.Show("用户名不能为空!");txtId.Focus();}else if (txtPsw.Text.Trim() == ""){MessageBox.Show("密码不能为空!");txtPsw.Focus();}else{string psw = GetMd5Str(txtPsw.Text.Trim());string sqlStr = "insert into tbl_User values('" + txtId.Text.Trim() + "','" + psw.Trim() + "')";SqlCommand cmd = new SqlCommand(sqlStr, conn);mandType = CommandType.Text;conn.Open();cmd.ExecuteNonQuery();conn.Close();MessageBox.Show("注册成功!");}}catch (Exception ex){MessageBox.Show(ex.Message);}}// ********************************************************************************************************由代码可知,“userPsw”字段的信息是MD5加密方式保存的,即使数据库被人取得,也不可能知道用户密码具体是什么,当然,账号信息也就不会泄露。

相关主题