Md5加密简介

来源:互联网 发布:热阻计算软件 编辑:程序博客网 时间:2024/05/21 19:21
MD5数据加密简介

    现在网络上一般的网站,稍微完善一点的,往往都需要用户先注册,提供诸如电子邮件、账号、密码等信息。成为网站栏目的注册用户,才可以享受网站一些特殊栏目提供的信息或者服务,例如免费电子邮件、论坛、聊天等。而对于电子商务网站,用户需要购买商品,就一定需要详细而准确地注册,而这些信息,往往是用户很隐秘的信息,比如电话、电子邮件、地址等,所以,注册信息对于用户和网站都是很重要的资源,不能随意透露,更加不能存在安全上的隐患。

    如果读者想设计一个需要用户注册的网站,根据现在的常用技术实现方法,可以在数据库中建立一个用于存放用户信息的表,这个表中至少包括用户账号字段UserAccount和用户密码字段Password。当然,实际应用中一个用户信息表不可能就只有这些信息,往往会根据网站服务要求,适当增加一些其他的信息,以方便网站提供更加完善的服务。一般地,一个用户信息占用这个用户信息表的一行也就是一个数据记录,当用户登录或者提交资料的时候,程序将用户填写的信息与表中的信息对照,如果用户账号和密码都准确无误,那么说明这个用户是合法用户,通过注册;反之,则是非法用户,不许通过。

    然而,这样并没有达到安全的要求。因为保存在数据库中的用户资料没有进行任何的保密措施,对于一些文件型数据库比如Access等,如果有人得到这个文件,那么所有的资料都会泄露。更加重要的是,如果一个不负责任的网管,不需要任何技术手段,就可以查看网站中的任何资料,这样数据库中就没有加密的用户信息,对于网管而言,查看实在是太简单了。所以,为了增加安全性,有必要对数据库中的资料进行加密,这样,即使有人得到了整个数据库,如果没有解密算法,也一样不能查看到数据库中的用户信息。

    在现阶段,有两种加密方式,单向加密和双向加密。双向加密是加密算法中最常用的,它将可以直接理解的明文数据加密为不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文。双向加密适合于隐秘通信,例如,用户在网上购物时,需要向网站提交信用卡密码,用户当然不希望自己的数据直接在网上明文传送,因为这样很可能被别的用户“偷听”,用户希望自己的信用卡密码是通过加密以后,再在网络传送,因此网站接收到用户的数据以后,通过解密算法就可以得到准确的信用卡账号。单向加密刚好相反,只能对数据进行加密,也就是说,没有办法对加密以后的数据进行解密。单向加密一般用于数据库中用户信息的加密。当用户创建一个新的账号或者密码时,他的信息不是直接保存到数据库中,而是经过一次加密以后再保存,这样,即使这些信息被泄露,也不能立即理解这些信息的真正含义。

    MD5就是采用单向加密的加密算法。MD5的全称是Message-Digest Algorithm 5,在20世纪90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。

    Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一个128bit的大整数。

现在许多网站上都使用MD5对用户保存在数据库中的信息进行加密。这主要是因为MD5具有几个很重要的特性,第一是任意两段明文数据,使用MD5加密以后的密文不相同;第二是任意一段明文数据,经过MD5加密以后,其结果永远不变;第三是使用MD5加密的数据破解非常不容易。

    现在网上MD5的ASP加密程序非常多,而且大部分都已经模块化,可以把这些程序放到自己的文件夹下,然后直接引用即可。这里将不再具体列出。

    md5是单向的不可逆的加密算法。

下面是java语言实现的源代码:

 import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Test {public static void main(String[] args) {MD5Test md5Test=new MD5Test();}public MD5Test(){this.Md5("zijiaobingbu");}private static void Md5(String plainText ) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(plainText.getBytes()); byte b[] = md.digest(); int i; StringBuffer buf = new StringBuffer(""); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if(i<0) i+= 256; if(i<16) buf.append("0"); buf.append(Integer.toHexString(i)); } System.out.println("32bit result: " + buf.toString());//32位的加密 System.out.println("16bit result: " + buf.toString().substring(8,24));//16位的加密 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } }


输出结果是:

32bit result: a27a8a31b7f5c7c518c8bb6b65f42940
16bit result: b7f5c7c518c8bb6b

其中16位的结果是32位的结果的第9-24位。

原创粉丝点击