Java实现MD5加密,具体代码如下:

package com.bstek.tools;

import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * Md5
 * 提供对字符串的md5-->stringMD5
 * 提供对文件的Md5-->fileMD5
 *
 * 对于大文件,可以使用DigestInputStream
 */
public class Md5Utils {

    protected static char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    protected static MessageDigest messageDigest = null;

    static{
        try{
            // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
            messageDigest = MessageDigest.getInstance("MD5");
        }catch (NoSuchAlgorithmException e) {
            System.err.println(Md5Utils.class.getName()+"初始化失败,MessageDigest不支持MD5Util.");
            e.printStackTrace();
        }
    }

    private static String bufferToHex(byte bytes[], int m, int n) {
       StringBuffer stringbuffer = new StringBuffer(2 * n);
       int k = m + n;
       for (int l = m; l < k; l++) {
        appendHexPair(bytes[l], stringbuffer);
       }
       return stringbuffer.toString();
    }  

    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {  

       char c0 = hexDigits[(bt & 0xf0) >> 4];
       char c1 = hexDigits[bt & 0xf];
       stringbuffer.append(c0);
       stringbuffer.append(c1);
    } 

    private static String bufferToHex(byte bytes[]) {
        return bufferToHex(bytes, 0, bytes.length);
    }

    /**
     * 字符串的md5加密
     * @param input
     * @return
     */
    public static String stringMD5(String input) {
          // 输入的字符串转换成字节数组
         byte[] inputByteArray = input.getBytes();
         // inputByteArray是输入字符串转换得到的字节数组
         messageDigest.update(inputByteArray);
         // 转换并返回结果,也是字节数组,包含16个元素
         byte[] resultByteArray = messageDigest.digest();
         // 字符数组转换成字符串返回
         return bufferToHex(resultByteArray);
    }
    /**
     * 文件的md5加密
     * @param inputFile
     * @return
     * @throws IOException
     */
    public static String fileMD5(String inputFile) throws IOException {
          // 缓冲区大小(这个可以抽出一个参数)
          int bufferSize = 256 * 1024;
          FileInputStream fileInputStream = null;
          DigestInputStream digestInputStream = null;
          try {
             // 使用DigestInputStream
             fileInputStream = new FileInputStream(inputFile);
             digestInputStream = new DigestInputStream(fileInputStream,messageDigest);
             // read的过程中进行MD5处理,直到读完文件
             byte[] buffer =new byte[bufferSize];
             while (digestInputStream.read(buffer) > 0);
             // 获取最终的MessageDigest
             messageDigest= digestInputStream.getMessageDigest();
             // 拿到结果,也是字节数组,包含16个元素
             byte[] resultByteArray = messageDigest.digest();
             // 同样,把字节数组转换成字符串
             return bufferToHex(resultByteArray);
          } finally {
             try {
                digestInputStream.close();
             } catch (Exception e) {
             }
             try {
                fileInputStream.close();
             } catch (Exception e) {
             }
          }
       }

    /**
     * @param args
     */
    public static void main(String[] args) {
        //测试字符串MD5加密
        //123456: e10adc3949ba59abbe56e057f20f883e
        //eastcom:  6997c46956185a7c4d452646fc9c69e2
        System.out.println(stringMD5("eastcom"));

        try {
            long startTime = System.currentTimeMillis();
            //测试文件MD5加密
            String FilePath = "D:/ilink_ide.zip"; //4227e9fc4bd71ff34887d47867967b29
            System.out.println(fileMD5(FilePath));

            long endTime = System.currentTimeMillis();
            System.out.println((endTime - startTime)/1000); 

        } catch (IOException e) {

            e.printStackTrace();
        }
    }

    /**
     * 参考文章:
     *  http://www.zhihu.com/question/23702510
     *  http://blog.csdn.net/lf_software_studio/article/details/8025497
     *  http://my.oschina.net/laigous/blog/106646
     *  http://blog.csdn.net/wangqiuyun/article/details/22941433
     */

}

转载请注明出处...

Java实现MD5加密_字符串加密_文件加密的更多相关文章

  1. python基础操作_字符串操作_列表操作list

    #字符串可以通过下表取值,如下程序 names='java python' print(names[0],names[5]) #使用for循环轮询所有name值 ''' for name in nam ...

  2. java_基础知识_字符串练习题_计算两个字符串的最长公共字串长度

    package tek; Java算法——求出两个字符串的最长公共字符串 /** * @Title: 问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. * @author 匹夫( ...

  3. Day2_数字类型_字符串类型_列表类型_元组_字典_集合_字符编码_文件处理

    数字类型: 作用:年纪,等级,薪资,身份证号等: 10进制转为2进制,利用bin来执行. 10进制转为8进制,利用oct来执行. 10进制转为16进制,利用hex来执行. #整型age=10 prin ...

  4. Day2_数字类型_字符串类型_列表类型

    数字类型: 作用:年纪,等级,薪资,身份证号等: 10进制转为2进制,利用bin来执行. 10进制转为8进制,利用oct来执行. 10进制转为16进制,利用hex来执行. #整型age=10 prin ...

  5. Winform 加密连接字符串“未能提供RsaProtectedConfigurationProvider加密,对象已存在”的解决方案

    当一台机器已安装软件,并有新用户需要使用此软件时提示“未能提供RsaProtectedConfigurationProvider加密,对象已存在”. 这是因为加密模式是用户模式,需要运行以下脚本添加新 ...

  6. 【Java】Swing+IO流实现一个简单的文件加密程序(demo版)

    留着参考 EncrytService package com.my.service; import java.io.File; import java.io.FileInputStream; impo ...

  7. 【Quick 3.3】资源脚本加密及热更新(一)脚本加密

    [Quick 3.3]资源脚本加密及热更新(一)脚本加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.脚本加密 quick框架已经封装好加密模块,与加密有关的文件在引擎目录/quic ...

  8. TEA加密算法的文件加密和解密的实现

    一.TEA加密算法简介 TEA加密算法是由英国剑桥大学计算机实验室提出的一种对称分组加密算法.它采用扩散和混乱方法,对64位的明文数据块,用128位密钥分组进行加密,产生64位的密文数据块,其循环轮数 ...

  9. Android版本的"Wannacry"文件加密病毒样本分析(附带锁机)

    一.前言 之前一个Wannacry病毒样本在PC端肆意了很久,就是RSA加密文件,勒索钱财.不给钱就删除.但是现在移动设备如此之多,就有一些不法分子想把这个病毒扩散到移动设备了,这几天一个哥们给了一个 ...

随机推荐

  1. shell学习笔记(一)

    1.第一行必须以#!/bin/bash #!表示脚本使用后面的解释器解释执行 2.echo 打印输出 例如   echo "hello world" > aa.txt 3.接 ...

  2. win10 + Debian9.1双系统安装笔记

    今天去163镜像上下载了"linuxmint-18.2-cinnamon-64bit.iso"和win10安装了双系统,感觉比在桌面方面十分不错,下面mark一下自己安装过程中的总 ...

  3. Spring与Quartz的整合实现定时任务调度(转)

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考.我使用的是Maven来管理项目,需要的Jar包我给大家贴出 ...

  4. Linux(Fedora) 安装 Oracle XE Database

    Fedora 安装 Oracle XE Database Fedora 20Oracle XeOracle VM VirtualBoxFedora 安装oracle 数据库 环境: Oracle VM ...

  5. MySQL show 语句

    总览show 语句 show tables from database_name; -- 显示当前数据库中所有表的名称.  show databases; -- 显示mysql中所有数据库的名称.  ...

  6. @media实现网页自适应中的几个关键分辨率

    不同分辨率设备或不同窗口大小下网页布局经常是不同的,一不小心就会发生错位.可以利用@media screen实现网页布局的自适应,但是怎样兼容所有主流设备就成了问题.到底分辨率是多少的时候设置呢?首先 ...

  7. 以打印日志为荣之logging模块详细使用

    啄木鸟社区里的Pythonic八荣八耻有一条: 以打印日志为荣 , 以单步跟踪为耻; 很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python ...

  8. Hibernate注解-类级别注解

  9. anaconda安装加速镜像问题解决

    Anaconda使用conda连接网络出现错误 我使用的是windows10 64bit下的Anaconda2,在安装和更新包的时候出现以下报错信息. 这是使用默认源安装包的报错信息: C:Users ...

  10. Python常用库大全

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. v ...