消息摘要算法又成散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可以通过散列值反推其原始信息。
 
消息摘要算法分为以下三大类:
      MD(Message Digest ,消息摘要)
      SHA(Secure Hash Algorithm ,安全散列算法)
      MAC(Message Authentication Code ,消息认证码)
 
本篇文章仅说明MD5算法
 
MD系列算法包括MD2、MD4、MD5这三种算法
MD系统的消息摘要算法都产生128位的消息摘要,转换成16进制之后就是32位的16进制数。即16进制的MD5消息摘要都是32位的
 
Java自带的MessageDigest类(如果需要处理流的则使用DigestInputStream、DigestOutputStream)实现MD5摘要信息算法
注意:Java 自动的仅支持MD2和MD5
/**
     * MD5消息摘要
     * @throws Exception
     */
    public static void md5Hex() throws Exception{
        //获的MD5消息摘要
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update("中国".getBytes("utf-8"));
        byte[] result = md5.digest();
 
 
        //转换成16进制字符串,注意:转换成16进制不是MD5消息摘要中的步骤,所以它不是必须的
        String hexString = toHexString(result);
        System.out.println(hexString); 
    }
    
    
    
    /**
     * 将字节数组转换成16进制的字符串
     * @param bytes
     * @return
     */
    public static String toHexString(byte[] bytes){
        StringBuffer sb = new StringBuffer();
        for(byte b: bytes){
            String hex = Integer.toHexString(b & 0x0FF);
            if(hex.length()==1) hex = "0" + hex;
            sb.append(hex);
        }
        return sb.toString();

}  

 
通过Apache的消息摘要工具类org.apache.commons.codec.digest.DigestUtils实现
Apache的消息摘要工具类实际是对Java的MessageDigest类使用步骤的封装,简便了我们的开发
DigestUtils.md5Hex("中国".getBytes("utf-8"))  
 
 
 
 
实现文件的MD5消息摘要计算
方案一、跟计算普通字符串的MD5值一样,使用MessageDigest类
public static void md5File2() throws Exception{
   FileInputStream fis = new FileInputStream("f:\\T1-1_20140910_80070000.dat");
   byte[]buffer = new byte[1024];
   int count = -1;
   ByteArrayOutputStream bout = new ByteArrayOutputStream();
   while((count=fis.read(buffer))>-1){
       bout.write(buffer, 0, count);
   }
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   byte[] result = md5.digest(bout.toByteArray());
   //打印出十六进制字符串
   System.out.println(toHexString(result));

}

 
 
方案二、使用DigestInputStream类
public static void md5File1() throws Exception{
   DigestInputStream dis = new DigestInputStream(new FileInputStream("f:\\T1-1_20140910_80070000.dat") ,MessageDigest.getInstance("MD5"));
   byte[]buffer = new byte[1024];
   while(dis.read(buffer)>-1){
            
   }
   MessageDigest md5 = dis.getMessageDigest();
   byte[] result = md5.digest();
   System.out.println(toHexString(result));

}

 
通过DigestInputStream类的read方法可以知道,其实使用DigestInputStream类实现的原理跟“方案一”是一样的。
它也是从文件流中读取字节,然后调用MessageDigest类的update方法更新进去的。下面是DigestInputStream类的read方法
public int read(byte[] b, int off, int len) throws IOException {
   int result = in.read(b, off, len);
   if (on && result != -1) {
       digest.update(b, off, result);
   }
   return result;

}  

 

 
 
 

MD5摘要(Java实现)的更多相关文章

  1. 利用Java自带的MD5加密java.security.MessageDigest;

    MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...

  2. 系统管理模块_用户管理1_实现用户有关的功能_测试功能、解决事务的问题、对密码进行MD5摘要

    系统管理模块__用户管理1__实现用户有关的功能 了解用户管理要做什么(增删改查初始化密码) 设计实体 分析功能有几个对应几个请求 增删改查有6个请求,初始化密码一个 实现增删改查一组功能的步骤流程 ...

  3. MD5在java中的使用

    MD5是什么? MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的"数字指纹".任何一个文件,无论是 ...

  4. 将32位MD5摘要串转换为128位二进制字符串

    将32为MD5摘要串转换为128位二进制字符串: /// <summary> /// 将字符串转成二进制 /// </summary> /// <param name=& ...

  5. 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。

    /** * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名. */ private function createSign($parameters,$key) { $signP ...

  6. 解决Javascript md5 和 Java md5 中文加密后不同问题

    Javascript md5 和 Java md5 带中文字符加密结果不一致,可以通过编码进行转化. javascript可以使用encodeURLComponent将中文先转化一次再进行MD5加密. ...

  7. 2 MD5加密 java实现

    百度百科对MD5的说明是: Message Digest Algorithm MD5(中文名为消息摘要算法第 五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护. MD5即Mess ...

  8. MD5加密--Java

    MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.R ...

  9. 消息摘要java.security.MessageDigest

    这是一种与消息认证码结合使用以确保消息完整性的技术.主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4.MD5.SHA-1,jdk1.5对 ...

随机推荐

  1. node.js学习一——什么是node.js

    定义:node.js是运行在服务器端的运用了谷歌v8引擎的javascript运行平台 特点:1. 异步式I/O(非阻塞式I/O) 2. 事件驱动 什么是异步式I/O(非阻塞式I/O)? 要了解什么是 ...

  2. 在WinRT程序中使用MEF

    今天试了一下在WinRT中使用MEF,这里简单的介绍一下步骤. 首先,使用NuGet安装MEF 然后,就可以使用MEF组装插件了,简单的示例如下: interface ILogger    {     ...

  3. Linux之ps查找进程用kill终止命令

    http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html http://blog.csdn.net/andy572633/article ...

  4. netstat 用法

    https://linux.cn/article-2434-1.html Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),ma ...

  5. USB High Speed Inter-Chip (HSIC) IP: What is it? And why should I use it?

    来源: https://www.synopsys.com/dw/dwtb.php?a=hsic_usb2_device What is HSIC? HSIC (High-Speed Inter-Chi ...

  6. 如何垂直居中元素(浮动元素&居中一个<img>)?

    1.如何居中一个浮动元素? 方法一:已知元素的高度   <!DOCTYPE html> <html lang="en"> <head> < ...

  7. 微信开发之消息接收与回复--weixin-java-tools

    一.前言 在上一篇文章<微信开发之如何使用开发工具--weixin-java-tools>中我给各位介绍了weixin-java-tools,并且介绍了如何使用weixin-java-to ...

  8. 快速打开IIS的方法

    方法一: 在运行(win+r)输入inetmgr 方法二: 控制面板\所有控制面板项\管理工具\IIS 建议使用第一种方法

  9. OpenGL.Vertex Array Object (VAO) [转]

    http://www.cppblog.com/init/archive/2012/02/21/166098.html 一 OpenGL抛弃glEnable(),glColor(),glVertex() ...

  10. EL表达式介绍(1)

    1. 产生背景: 在MVC体系结构中,JSP页面只是用来显示数据,但JSP脚本中的表达式功能不够强大,它不能直接对隐式对象中某对象的属性进行显示,需要配合 scriptlet才能显示数据,很是麻烦,如 ...