Java中的MessageDigest类加密详解

 更新时间:2024年01月16日 10:10:32   作者:禅悟刂  
这篇文章主要介绍了Java中的MessageDigest类加密详解,MessageDigest 类是一个引擎类,它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的,需要的朋友可以参考下

MessageDigest类

MessageDigest 类是一个引擎类,它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的。

密码上安全的报文摘要可接受任意大小的输入(一个字节数组),并产生固定大小的输出,该输出称为一个摘要或散列。

创建MessageDigest对象

计算信息摘(即散列码)要做的第一步是创建 MessageDigest对象 实例。

像所有的引擎类一样,获取某类报文摘要算法(即散列算法,比如MD5)的  MessageDigest 对象的途径是调用 MessageDigest 类中的 getInstance 静态 factory 方法:

    public static MessageDigest getInstance(String algorithm)
  • 注意1:即时给定MessageDigest的实现是不可复制的,则仍然能够通过getInstance方法实例化几个实例计算来同时进行摘要信息的计算。
  • 注意2:由于历史原因,此类是抽象的,是从 MessageDigestSpi 扩展的。应用程序开发人员只应该注意在此 MessageDigest 类中定义的方法;超类中的所有方法是供希望提供自己的信息摘要算法实现的加密服务提供者使用的。 
  • 注意3:MessageDigest并不是单实例的。如下代码所示:
  try
    {
        MessageDigest mdTemp1 = MessageDigest.getInstance("MD5");
        MessageDigest mdTemp2= MessageDigest.getInstance("MD5");
        MessageDigest mdTemp3= MessageDigest.getInstance("MD5");
        System.out.println("mdTemp1==mdTemp2?:"+(mdTemp1==mdTemp2));
        System.out.println("mdTemp2==mdTemp3?:"+(mdTemp2==mdTemp3));
    } catch (NoSuchAlgorithmException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

运行结果

mdTemp1==mdTemp2?:false
mdTemp2==mdTemp3?:false

注意:算法名不区分大小写。例如,以下所有调用都是相等的:

MessageDigest.getInstance("SHA");
MessageDigest.getInstance("sha");
MessageDigest.getInstance("sHa");

方法摘要

方法摘要
 Objectclone() 
          如果实现是可复制的,则返回一个副本。
 byte[]digest() 
          通过执行诸如填充之类的最终操作完成哈希计算。
 byte[]digest(byte[] input) 
          使用指定的字节数组对摘要进行最后更新,然后完成摘要计算。
 intdigest(byte[] buf, int offset, int len) 
          通过执行诸如填充之类的最终操作完成哈希计算。
 StringgetAlgorithm() 
          返回标识算法的独立于实现细节的字符串。
 intgetDigestLength() 
          返回以字节为单位的摘要长度,如果提供程序不支持此操作并且实现是不可复制的,则返回 0。
static MessageDigestgetInstance(String algorithm) 
          生成实现指定摘要算法的 MessageDigest 对象。
static MessageDigestgetInstance(String algorithm, Provider provider) 
          生成实现指定提供程序提供的指定算法的 MessageDigest 对象,如果该算法可从指定的提供程序得到的话。
static MessageDigestgetInstance(String algorithm, String provider) 
          生成实现指定提供程序提供的指定算法的 MessageDigest 对象,如果该算法可从指定的提供程序得到的话。
ProvidergetProvider() 
          返回此信息摘要对象的提供程序。
static booleanisEqual(byte[] digesta, byte[] digestb) 
          比较两个摘要的相等性。
 voidreset() 
          重置摘要以供再次使用。
 StringtoString() 
          返回此信息摘要对象的字符串表示形式。
 voidupdate(byte input) 
          使用指定的字节更新摘要。
 voidupdate(byte[] input) 
          使用指定的字节数组更新摘要。
 voidupdate(byte[] input, int offset, int len) 
          使用指定的字节数组,从指定的偏移量开始更新摘要。
voidupdate(ByteBuffer input) 
          使用指定的 ByteBuffer 更新摘要。

例子演示

public static void main(String[] args) throws NoSuchAlgorithmException {
		MessageDigest instance = MessageDigest.getInstance("md5");
		String UUID = java.util.UUID.randomUUID().toString();
		String pwd = "123456";
		String name = UUID+pwd;
		System.out.println("盐值:"+UUID);
		System.out.println("密码:"+pwd);
		System.out.println("盐值加密:"+name);
		instance.update(name.getBytes());
		instance.reset();
		byte[] digest = instance.digest(name.getBytes());
		StringBuilder sb = new StringBuilder();
		for (byte b : digest) {
			String row = Integer.toHexString(b&0xff);
			if(row.length()==1){
				row = "0" + row;
			}
			sb.append(row);
		}
		System.out.println("加密后:"+sb.toString());
	}

文件摘要加密

public void insertAttachement(String title, MultipartFile mFile) {
		if(title==null||title.trim().length()==0){
			throw new ServiceException("标题不能为空");
		}
		if(mFile==null){
			throw new ServiceException("不允许上传空文件");
		}
		byte[] bytes ;
		String digests= null;
		try {
            //将文件摘要转为字节
			bytes = mFile.getBytes();
            //将摘要后的字节数组进行MD5加密
			digests = DigestUtils.md5DigestAsHex(bytes);
		} catch (Exception e) {
			e.printStackTrace();
			throw new ServiceException("文件上传失败");
		}
		Integer rows = attachementsDao.getRowCountByDigest(digests);
		if(rows>0){
			throw new ServiceException("文件已上传,请勿重复上传!"); 
		}
		String fileName = mFile.getOriginalFilename();
		String contentType = mFile.getContentType();
		SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
		String timeDate = sd.format(new Date());
		String path = "F:"+File.separator+"upload"+File.separator+timeDate;
		File file = new File(path);
        //文件夹是否存在 不存在将创建
		if(!file.exists()){
			file.mkdirs();
		}
		File filepath = new File(path,fileName);
		try {
			mFile.transferTo(filepath);
		}  catch (IOException e) {
			e.printStackTrace();
			throw new ServiceException("文件上传失败");
		}
		Attachements att = new Attachements();
		att.setTitle(title);
		att.setFileName(fileName);
		att.setFilePath(filepath.getAbsolutePath());
		att.setFileDisgest(digests);
		att.setContentType(contentType);
		Integer row = attachementsDao.insertAttachement(att);
		if(row<1){
			throw new ServiceException("新增失败");
		}
	}

运行结果

盐值:c971db77-f109-401a-95f7-49b0f2bf0863
密码:123456
盐值加密:c971db77-f109-401a-95f7-49b0f2bf0863123456
加密后:525f7296b1ca744ca751344a4196ad17

到此这篇关于Java中的MessageDigest类加密详解的文章就介绍到这了,更多相关MessageDigest类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java注解处理器学习在编译期修改语法树教程

    java注解处理器学习在编译期修改语法树教程

    这篇文章主要为大家介绍了java注解处理器学习在编译期修改语法树教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Java泛型映射不同的值类型详解及实例代码

    Java泛型映射不同的值类型详解及实例代码

    这篇文章主要介绍了Java泛型映射不同的值类型详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • 深入了解Java SpringBoot自动装配原理

    深入了解Java SpringBoot自动装配原理

    在使用springboot时,很多配置我们都没有做,都是springboot在帮我们完成,这很大一部分归功于springboot自动装配。本文将详细为大家讲解SpringBoot的自动装配原理,需要的可以参考一下
    2022-03-03
  • SpringBoot实现登录拦截的示例代码

    SpringBoot实现登录拦截的示例代码

    如果我们不进行登录拦截的话,即使我们跳过登录页面直接去访问任意一个页面也能访问成功,那么登录功能就没有意义,同时也会存在安全问题,本文就来介绍一下SpringBoot登录拦截,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • java编程进行动态编译加载代码分享

    java编程进行动态编译加载代码分享

    这篇文章主要介绍了java编程进行动态编译加载代码分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Mac Maven环境搭建安装和配置超详细步骤

    Mac Maven环境搭建安装和配置超详细步骤

    这篇文章主要给大家介绍了关于Mac Maven环境搭建安装和配置的超详细步骤,Maven是一种常用的Java构建工具,它可以自动化构建、测试和打包Java项目,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题

    利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题

    这篇文章主要介绍了利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题的相关资料,需要的朋友可以参考下
    2016-05-05
  • Java程序初始化启动自动执行的三种方式

    Java程序初始化启动自动执行的三种方式

    这篇文章主要介绍了Java程序初始化启动自动执行的三种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot整合WebService服务的实现代码

    SpringBoot整合WebService服务的实现代码

    WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互,这篇文章主要介绍了SpringBoot整合WebService服务的实例代码,需要的朋友可以参考下
    2022-02-02
  • 详解如何获取java中类的所有对象实例

    详解如何获取java中类的所有对象实例

    如何在运行时获取一个Java类的所有对象实例呢,本文给大家介绍一种底层实现的方式,基于jvmti,代码用C++实现,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10

最新评论