消息摘要算法又成散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可以通过散列值反推其原始信息。
 
消息摘要算法分为以下三大类:
      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. vscode monokai

    https://studiostyl.es/schemes/sublime-text-3-monokai

  2. linux下分区相关知识

    Linux 规定了主分区(或者扩展分区)占用 1 至 16 号码中的前 4 个号码.以第一个 IDE 硬盘为例说明,主分区(或者扩展分区)占用了 hda1.hda2.hda3.hda4,而逻辑分区占用 ...

  3. UITextField的returnkey点击事件

    关于隐藏软键盘,网上的办法良莠不齐,大多是通过实现UITextFieldDelegate来隐藏软键盘,该方法代码较多,且在文本框很多的时不好处理.我经过搜索与摸索,找到了最佳的处理办法.(引用的)一. ...

  4. WebLogic Server的密码复杂性规则设置

    WebLogic Server默认的密码复杂性规则是长度为8位以上,必须包含数字和字母,但对于很多企业的安全而言是不足够的,因此WebLogic Server在Security模块中提供了Passwo ...

  5. python3发送html格式的邮件

    def send_mail(to_list, sub, content, attpath): me = "*******" + "<" + mail_us ...

  6. flask的文件上传和下载

    http://flask.pocoo.org/docs/1.0/api/ http://docs.jinkan.org/docs/flask/api.html?highlight=download h ...

  7. fedora25安装和docker-ce_清华源

    docker-ce_清华源 https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/fedora/ fedora25 docker-ce版本: htt ...

  8. 【转】python中文转换url编码

    今天要处理百度贴吧的东西.想要做一个关键词的list,每次需要时,直接添加 到list里面就可以了.但是添加到list里面是中文的情况(比如‘丽江’),url的地址编码却是'%E4%B8%BD%E6% ...

  9. 转:JavaWeb学习总结(一) 写得相当不错

    这个系列写的相当不错,浅显易懂,图文并茂 http://www.cnblogs.com/xdp-gacl/tag/JavaWeb%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93 ...

  10. ThreadLocal的实现原理(读书笔记)

    ThreadLocal的set方法和get方法,从set方法开始: public void set(T value) { Thread t = Thread.currentThread();//获取当 ...