zoukankan      html  css  js  c++  java
  • MD5在java中的使用

    MD5是什么?        

    MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的"数字指纹"。任何一个文件,无论是可执行程序、图像文件、临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息值,并且如果这个文件被修改过,它的MD5值也将随之改变。因此,我们可以通过对比同一文件的MD5值,来校验这个文件是否被"篡改"过。 
    MD5到底有什么用?  
    当我们下载了文件后,如果想知道下载的这个文件和网站的原始文件是否一模一样,就可以给自己下载的文件做个MD5校验。如果得到的MD5值和网站公布的相同,可确认所下载的文件是完整的。如有不同,说明你下载的文件是不完整的:要么就是在网络下载的过程中出现错误,要么就是此文件已被别人修改。为防止他人更改该文件时放入病毒,最好不要使用。一般正规的站点,都会提供文件md5校验码,这是为了双方都方便。
           今天上网搜索在Lucene如何避免重复建立索引,看到介绍了一种方法就是用MD5为每个文件赋一个惟一的值,当再次为同一个文件建立索引时,会通过MD5的值识别出相同的文件。于是收藏了MD5在java中使用的代码:
    package com.mr.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.security.MessageDigest;
    
    /**
     * @author CXY
     */
    public class SecurityUtil {
    	/**
    	 * 把字节数组转成16进位制数
    	 * @param bytes
    	 * @return
    	 */
    	public static String bytesToHex(byte[] bytes) {
    		StringBuffer md5str = new StringBuffer();
    		//把数组每一字节换成16进制连成md5字符串
    		int digital;
    		for (int i = 0; i < bytes.length; i++) {
    			 digital = bytes[i];
    			if(digital < 0) {
    				digital += 256;
    			}
    			if(digital < 16){
    				md5str.append("0");
    			}
    			md5str.append(Integer.toHexString(digital));
    		}
    		return md5str.toString().toUpperCase();
    	}
    	
    	/**
    	 * 把字节数组转换成md5
    	 * @param input
    	 * @return
    	 */
    	public static String bytesToMD5(byte[] input) {
    		String md5str = null;
    		try {
    			//创建一个提供信息摘要算法的对象,初始化为md5算法对象
    			MessageDigest md = MessageDigest.getInstance("MD5");
    			//计算后获得字节数组
    			byte[] buff = md.digest(input);
    			//把数组每一字节换成16进制连成md5字符串
    			md5str = bytesToHex(buff);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return md5str;
    	}
    	/**
    	 * 把字符串转换成md5
    	 * @param str
    	 * @return
    	 */
    	public static String strToMD5(String str) {
    		byte[] input = str.getBytes();
    		return bytesToMD5(input);
    	}
    	
    	/**
    	 * 把文件转成md5字符串
    	 * @param file
    	 * @return
    	 */
    	public static String fileToMD5(File file) {
    		if(file == null) {
    			return null;
    		}
    		if(file.exists() == false) {
    			return null;
    		}
    		if(file.isFile() == false) {
    			return null;
    		}
    		FileInputStream fis = null;
    		try {
    			//创建一个提供信息摘要算法的对象,初始化为md5算法对象
    			MessageDigest md = MessageDigest.getInstance("MD5");
    			fis = new FileInputStream(file);
    			byte[] buff = new byte[1024];
    			int len = 0;
    			while(true) {
    				len = fis.read(buff, 0, buff.length);
    				if(len == -1){
    					break;
    				}
    				//每次循环读取一定的字节都更新
    				md.update(buff,0,len);
    			}
    			//关闭流
    			fis.close();
    			//返回md5字符串
    			return bytesToHex(md.digest());
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    }
  • 相关阅读:
    Vue blur事件优先级高于click事件
    常用的正则表达式
    vue-socket.io 3.0.9 的最新版本不能用
    nvm
    Webpack4:Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead
    Echart 挪动滑块时,前端根据起始日期重新计算数据,造成了数据渲染错误
    Ant Design table 排序 ,点击头部只有升序和降序
    雷达图 点击事件
    修改远程仓库地址
    vue.cli发布不同的环境
  • 原文地址:https://www.cnblogs.com/huqianliang/p/5683989.html
Copyright © 2011-2022 走看看