java加密解密研究6、MD算法家族
一、简述
MD5算法是典型的消息摘要算法,其前身有MD2、MD3和MD4算法,它由MD4、MD3和MD2算法改进而来。不论是哪一种MD算法,它们都需 要获得一个随机长度的信息并产生一个123位的信息摘要。如果将这个128位的二进制摘要信息换算成十六进制,可以得到一个32位的字符串,故我们见到的 大部分MD5算法的数字指纹都是32为十六进制的字符串。
MD算法家族的发展史:
MD2算法:
1989年,著名的非对称算法RSA发明人之一----麻省理工学院教授罗纳德.李维斯特开发了MD2算法。这个算法首先对信息进行数据补位,使信
息的字节长度是16的倍数。再以一个16位的检验和做为补充信息追加到原信息的末尾。最后根据这个新产生的信息计算出一个128位的散列值,MD2算法由
此诞生。
MD4算法:
1990年,罗纳德.李维斯特教授开发出较之MD2算法有着更高安全性的MD4算法。在这个算法中,我们仍需对信息进行数据补位。不同的是,这种补
位使其信息的字节长度加上448个字节后成为512的倍数(信息字节长度mod 512
=448)。此外,关于MD4算的处理和MD2算法有很大的差别。但最终仍旧会获得一个128为的散列值。MD4算法对后续消息摘要算法起到了推动作用,
许多比较有名的消息摘要算法都是在MD4算法的基础上发展而来的,如MD5、SHA-1、RIPE-MD和HAVAL算法等。
MD5算法:
1991年,继MD4算法后,罗纳德.李维斯特教授开发了MD5算法,将MD算法推向成熟。MD5算法经MD2、MD3和MD4算法发展而来,算法复杂程度和安全强度打打提高,但浙西MD算法的最终结果都是产生一个128位的信息摘要。这也是MD系列算法的特点。
一、java提供的MD2和MD5算法应用
package com.tao.test; import java.io.UnsupportedEncodingException;
import java.security.MessageDigest; import javax.xml.bind.annotation.adapters.HexBinaryAdapter; /**
* MD加密工具类
*/
class MDCoder {
// MD2加密
public static String encodeMd2(byte[] data) throws Exception {
// 初始化MessageDigest
MessageDigest md = MessageDigest.getInstance("MD2");
// 执行摘要信息
byte[] digest = md.digest(data);
// 将摘要信息转换为32位的十六进制字符串
return new String(new HexBinaryAdapter().marshal(digest));
} // MD5加密
public static String encodeMd5(byte[] data) throws Exception {
// 初始化MessageDigest
MessageDigest md = MessageDigest.getInstance("MD5");
// 执行摘要信息
byte[] digest = md.digest(data);
// 将摘要信息转换为32位的十六进制字符串
return new String(new HexBinaryAdapter().marshal(digest));
}
} public class MDTest {
public static void main(String[] args) throws UnsupportedEncodingException, Exception {
String testString = "123456asdasdfsdfsdfsdf";
System.out.println(MDCoder.encodeMd2(testString.getBytes()));
System.out.println(MDCoder.encodeMd5(testString.getBytes()));
}
}
二、BouncyCastle补充的MD4算法的应用
package Test; import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.Security; import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex; /**
* MD加密工具类
*/
class MDCoder {
// MD2加密
public static String encodeMd4(byte[] data) throws Exception {
//加入BouncyCastle的支持
Security.addProvider(new BouncyCastleProvider());
// 初始化MessageDigest
MessageDigest md = MessageDigest.getInstance("MD4");
//执行摘要信息
byte[] digest=md.digest(data);
//将摘要信息转换为32位的十六进制字符串
return new String(Hex.encode(digest));
}
} public class MDTest {
public static void main(String[] args) throws UnsupportedEncodingException, Exception {
String testString="123456asdasdfsdfsdfsdf";
String digestString=MDCoder.encodeMd4(testString.getBytes());
System.out.println(digestString);
}
}
三、Commons Codec提供的实现
Commons Codec提供了消息摘要的工具类-----DigestUtils类。DigestUtils类是对Sun提供的MessageDigest类的一次封装,提供了MD5和SHA系列消息摘要算法的实现。
package Test; import java.io.UnsupportedEncodingException; import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils; /**
* MD加密工具类
*/
class MDCoder {
// MD5加密 返回十六进制的字符串
public static String encodeMd5Hex(byte[] data) throws Exception {
return DigestUtils.md5Hex(data);
} // MD5加密,返回十进制的字节数组
public static byte[] encodeMd5(byte[] data) {
return DigestUtils.md5(data);
}
} public class MDTest {
public static void main(String[] args) throws UnsupportedEncodingException, Exception {
String testString = "123456asdasdfsdfsdfsdf";
//十六进制的字符串
String digestString = MDCoder.encodeMd5Hex(testString.getBytes());
System.out.println(digestString); //字节数组
byte[] digest=MDCoder.encodeMd5(testString.getBytes());
String dString=new String(Hex.encodeHex(digest));
System.out.println(dString);
}
}
实际应用中根据自己的选择用选择不同的方法来实现MD消息摘要算法
转自:http://blog.csdn.net/lonelyroamer/article/details/7652320
java加密解密研究6、MD算法家族的更多相关文章
- java加密解密算法位运算
一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算 ...
- password学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest). 它是一个唯一相应一个消息或文本的固定长度 ...
- Java加密解密大全
ChinaSEI系列讲义(By 郭克华) Java加密解密方法大全 如果有文字等小错,请多包涵.在不盈利的情况下,欢迎免费传播. 版权所有.郭克华 本讲义经 ...
- ◆JAVA加密解密-3DES
从数据安全谈起 当你使用网银时,是否担心你的银行卡会被盗用? 当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露? 作为开发者,编写安全的代码比编写优雅的代码更重要,因为 ...
- java加密解密的学习
注:此文章只是对如何学习java加密解密技术做一个讲解.并不涉及具体的知识介绍,如果有需要请留言,有时间我补冲长.个人觉着学习一个学习方法比学习一个知识点更有价值的多. 首先,对于加密解密知识体系没有 ...
- Java加密解密字符串
http://www.cnblogs.com/vwpolo/archive/2012/07/18/2597232.html Java加密解密字符串 旧文重发:http://www.blogjava ...
- java加密解密
java加密解密 public class MD5Util { /** * @param args */ public static void main(String[] args) { System ...
- java 加密解密工具类(实用!!!)
最近发现了一个加密解密的好例子,很方便使用,可以作为平时开发的工具集,记录一下. package com.sh.springboottdemo2.util; import com.sun.org.ap ...
- java加密-解密小结
加密算法可以分为 双向加密(对称加密.不对称加密) 单向加密(不可逆加密)—— MD5.sha.hmac... 在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密 有: ...
随机推荐
- preg_*匹配的字符串长度限制问题以及nginx,php上传文件过大问题
问题背景 使用插件上传高清图片,用的插件base64转码的,上传失败,接口提示:413 (Request Entity Too Large) 问题分析与解决 首先想到的是nginx和php的服务器配 ...
- html的常用基础应用
HTML结构 如下一段最简单的HTML代码:<html> <head> <title>HTML页面</title> ...
- 怎么看iOS human interface guidelines中的user control原则
最近离开了老东家,整理整理思路,因为一直做的是微信公众号相关的产品对app的东西有一段时间没有做过了,所以又看了一遍iOS human interface guidelines,看到user cont ...
- 第三章 Struts2配置详解
3.1 Struts2执行过程 1.获取Struts2资源 2.在应用程序中导入Struts2的类库 3.在web.xml中配置StrutsPrepareAndExecuteFilt ...
- ENetwork Basic Configuration PT Practice SBA
CCNA Exploration: 网络基础知识 (版本 4.0) A few things to keep in mind while completing this activity: 1 Do ...
- Spring aop切面插入事物回滚
<!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...
- HDU3518 后缀数组求不可重叠重复出现的不同子串个数
枚举子串长度,根据height分组,如果本组sa最小值与sa最大值之差超过枚举的长度,则本组对于答案贡献为1. #include <iostream> #include <vecto ...
- java构造代码块,构造函数和普通函数的区别和调用时间
在这里我们谈论一下构造代码块,构造函数和普通函数的区别和调用时间.构造代码块:最早运行,比构造函数运行的时间好要提前,和构造函数一样,只在对象初始化的时候运行.构造函数:运行时间比构造代码块时间晚,也 ...
- C语言学习第二章
今天开始学习常量,变量,基本数据类型,printf()函数和scanf()函数,算术运算符. 首先常量:是在程序中保持不变的量 变量:编写程序时,常常需要将数据存储在内存中,方便后面使用这个数据或者修 ...
- 【WPF】学习笔记(一)——做一个简单的电子签名板
参加实习(WPF)已经有两个多周的时间了,踩了一些坑,也算积累了一些小东西,准备慢慢拿出来分享一下.(●'◡'●) 这次呢就讲讲一个简单的电子签名板的实现. 先上张图(PS:字写得比较丑,不要太在意哈 ...