MessageDigest(加密)

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

 

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MessageDigest是一个Java类,用于提供密码上安全的报文摘要功能,例如SHA1或MD5等散列算法。 你可以通过调用MessageDigest类中的getInstance方法来创建MessageDigest对象实例,该方法接受一个算法名称作为参数。请注意,算法名称不区分大小写,因此可以使用任何大小写的形式来调用getInstance方法。 通过MessageDigest对象,你可以对任意大小的输入进行摘要计算,并生成一个固定大小的输出,这个输出就是摘要或散列。 要计算信息摘要,你首先需要创建一个MessageDigest对象实例,通过调用getInstance方法并传入相应的算法名称来完成。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用Java的MessageDigest实现MD5加密算法](https://blog.csdn.net/qq_41918166/article/details/115552035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MessageDigest加密)](https://blog.csdn.net/weixin_42575310/article/details/103065321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值