JAVA MD5算法应用

 

      在一些对安全需求比较高的WEB站点中,除了要保证数据的传输有保障之外,数据库的内容也需要做一些处理,像银行之类的系统,要防止外人取得数据,还不能让管理员看到账号和密码.很多时候都是利用MD5算法来保证数据的完整性和安全性,但是MD5算法并不是一个加密算法,它就像人的"指纹"一样,每个人都有指纹,而且指纹都不一样,MD5算法算出的结果,就像数据的指纹一样,任何数据,不论它占用多少空间,它的指纹都能作为这块数据的唯一标识.,SUN公司的JDK文档就描述了如何通过类java.security.MessageDigest
来完成JAVA的MD5算法实现.

     我们先来看一看它的继承关系:

     此类为抽象类,并且其父类也是抽象类, MessageDigestSpi 是一个Service Provider Interface (服务提供者接口),主要是为其子类提供方法摘要,并由其子类完成.

     由于 MessageDigest 是一个抽象类,我们不可以直接实例化它,得用它的静态方法就能得到这个对象的实例:

public static MessageDigest getInstance(String algorithm)
                                 throws NoSuchAlgorithmException
   它接受一个字符串参数,我们只需传递一个算法的名称即可,就像这样:
   MessageDigest md = MessageDigest.getInstance("md5");
   它返回实现了指定摘要算法的MessageDigest对象.
   接下来,我们只用把数据传递给MessageDigest对象的digest方法就行了:
   md.digest(data);
   public byte[] digest(byte[] input)
   这个方法接受一个byte[],返回这个经MD5算法算过的byte[].这个byte[]可以是任何字符,如果我把"1296105945865".getBytes()作为参数传递进去,
看看它的返回值:
   md.digest(rand.getBytes());
   //~[-53, -89, 11, -29, -127, 98, 90, 45, -119, -24, -80, -49, -38, 96, -35, 2]
这样的数据在HTTP协议中传输,会使浏览器疯掉,因为它也许根本不知道如何处理诸如:",e123,1;2,;,./;?=2h3jhkjl?;"这样的数据,一般都会把它转为以
16进制(32位)的方式,或者用BASE64转成"明文"再处理.
转成以16进制显示:
public String show(byte[] b){
    StringBuilder sb = new StringBuilder();
    for(int i = 0;i<b.length;i++){
        int high = (b[i] >> 4) & 0xF;    //取出高4位
        int low = b[i] & 0xF;            //取出低4位
        sb.append(String.format("%x%x", high,low));
    }
    System.out.println(sb);
    return sb.toString();       
}

在网上进行下载的时候,经常有网站在资源旁边附上md5验证码,就是让你在下载完成后,用md5算法把你下载的东西算一遍,把结果进行比较,如果一致,就表示你下载的资源确实和原版是一样的.假设某银行出示了相关网银驱动的md5码,你就可以在网上下载好驱动后,进行比较,稍有偏差,都可以认为此驱动被注入了木马之类的,因为相同的数据,会产生相同的"指纹".为什么很多人认为MD5算法是一个加密算法?因为很多人在数据库存用户密码的时候,不是存的密码,而是存的用MD5算法算过密码之后的数据.这样一来,就算有人知道某数据库里某用户的密码是什么,他也一样登录不进来,他在输入密码之后,输入的密码会进行MD5算法算过之后,再与数据库里存的密码数据进行比较.这样一来,安全性又提高了.

由于MD5算法算过的结果很多时候不太方便,除了以16进制显示之外,也可以用BASE64算法进行编码.BASE64就是通过其算法对数据处理后,处理得到的结果全部是以"明文"显示,所谓"明文",就是你能在键盘上看到的字符,而且像"."这样的特殊符号也没有,所以,用BASE64算法得到MD5算法结果的"明文"也可以.

     SUN公司也提供了一个类用来完成BASE64的算法:sun.misc.BASE64Encoder.由于官方并没有正式发布这个类,所以它的包名为misc,杂项的意思,在JDK1.6文档里面也找不到这个类的相关信息.但是使用起来很简单,很方便:

BASE64Encoder encoder = new BASE64Encoder();

encoder.encode(Bytes[]);      //返回String

关于BASE64Encoder的encode()方法,重载了7个,还有encodeBuffer()方法,就不在这里述说了,用法是一样的.另外,数据传输过后,还需要解码,就要用到sun.misc.BASE64Decoder这个类来完成了:

BASE64Decoder decoder = new BASE64Decoder();

decoder.decodeBuffer(String);

依靠BASE64Decoder的decodeBuffer()方法,就能完成数据的解码.这个方法同样重载了几次,使用是一样的.

 

时间: 2024-09-20 17:58:36

JAVA MD5算法应用的相关文章

java MD5算法返回数字型字串

算法   常有人问及MD5算法为何有些程序片断返回完全数字型结果而有些返回数字与字母的混合字串. 其实两种返回结果只是因为加密结果的不同显示形式,Blog中已经有.Net的实现,在此附加JAVA实现,供参考. JAVA的标准类库理论上功能也很强大,但由于虚拟机/运行时的实现太多,加之版本差异,有些代码在不同环境下运行会出现奇怪的异常结果,尤其以涉及字符集的操作为甚. package com.bee.framework.common; import java.security.MessageDig

Java生成MD5算法

原文:http://yilee.info/java-md5-algorithm.html D5即Message-Digest Algorithm 5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法. MD5算法的作用是让大容量信息在用数字签名软件签私人密匙前被"压缩"成一种保密的格式,将一个任意长度的"字节串"通过一个不可逆的字符串变换算法变换成一个128bit的大整数. 即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说

【VB】MD5算法

昨天才真正搞懂,ASP.NET和ASP是不同的!! google上搜了下,感觉这个介绍的挺好的: ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强.ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型.面向结构的编程语言,而非面向对象,这就明显产生以下几个问题: 1.代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力

java MD5加密实现代码_java

先从下面这张图对MD5加密实现进行了解,具体如下 package com.pb; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Scanner; /* * 验证MD5 * 1.初始化MessageDigest信息摘要对象 * 2.传入需要计算的字符串更新摘

MD5算法原理

//建议参考1 MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用.     MD5功能:    输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):    不同的输入得到的不同的结果(唯一性):    根据128位的输出结果不可能反推出输入的信息(不可逆):      MD5属不属于加密算法:    认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原

算法 日期-JAVA日期算法问题????

问题描述 JAVA日期算法问题???? 参数:开始时间.结束时间,时间格式:yyyy-MM-dd,可以考虑用UnixTime转换计算 前置条件: 1.每个月15日是定死的中间比对日期,即结算时间 2.开始时间必须是小于结束时间 需要解决的问题: 按输入的开始时间.结束时间,动态计算从开始时间到结束时间之间每个月与结算时间的相差天数,并且记录最后的结算日期 比如: 开始时间3月1日,结束时间5月10日, 3月1日至3月15日算一次天数,并且记录下3月15日, 然后开始时间变为3月15日,至4月15

MD5算法研究

算法 综述 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2.MD3和MD4发展而来.它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是MD2.MD4还是MD5,它们都需要获得一个随机长

MD5算法研究(1)

算法 综述 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2.MD3和MD4发展而来.它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是MD2.MD4还是MD5,它们都需要获得一个随机长

MD5算法研究(2)

算法 FF(b,c,d,a,M3,22,0xc1bdceee) FF(a,b,c,d,M4,7,0xf57c0faf) FF(d,a,b,c,M5,12,0x4787c62a) FF(c,d,a,b,M6,17,0xa8304613) FF(b,c,d,a,M7,22,0xfd469501) FF(a,b,c,d,M8,7,0x698098d8) FF(d,a,b,c,M9,12,0x8b44f7af) FF(c,d,a,b,M10,17,0xffff5bb1) FF(b,c,d,a,M11,2