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 blocke.printStackTrace();}

运行结果

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

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

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

方法摘要

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

MessageDigest(加密)相关推荐

  1. java sha256 64位,JAVA SHA256加密

    /** * 利用java原生的类实现SHA256加密 * * @param str * @return */ private String getSHA256(String str) { Messag ...

  2. 【微信开发】微信开发 之 开启开发模式

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/20494177 . GitHub源码位置 : -- HT ...

  3. md5 算法java实现_java实现MD5算法

    import java.security.MessageDigest; /** 加密工具* @author 刘彦青 * **/ public class EncryptUtil { /** MD5加密 ...

  4. 微信公众号开发教程(一)

    上一篇博客初始化项目已经完成,现在我们继续学习 1.装填spring-boot-starter-weixin依赖并完成快速开发框架的前置代码(README.md) pom.xml填写依赖 完整依赖 & ...

  5. [转]信息安全相关理论题(二)

    27.在工程实施之前,验收方可以不给施工方弱电布线图纸,但施工结束后必须有图纸 A. 对 B. 错 您的答案: 标准答案: B 28.在OSI七层协议中,提供一种建立连接并有序传输数据的方法的层是 A ...

  6. 利用Java自带的MD5加密java.security.MessageDigest;

    MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...

  7. messagedigest 图片加密_MessageDigest 加密和解密2

    -------------------解密--------------------------- package com.drawthink.platform.util; import java.io ...

  8. java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)

    转载 转载自:http://www.tuicool.com/articles/nMNVVj Java 自带的数据加密类MessageDigest(MD5或SHA加密) 说明: 在网站中,为了保护网站会 ...

  9. Java之加密工具类java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils

    Java之加密(信息摘要)工具类(依赖:java.security.MessageDigest或org.apache.commons.codec.digest.DigestUtils) 1. java ...

  10. MessageDigest实现单向加密(MD5、SHA1、SHA-256、SHA-512)

    单向加密与双向加密 双向加密是加密算法中最常用的,它将可以直接理解的明文数据加密为不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文.双向加密适 ...

最新文章

  1. BZOJ1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
  2. 三重for循环优化_MATALB中对循环操作的优化
  3. 迈入大数据时代 12项实名制助推平安建设精细化
  4. 小波滤波器与其他滤波器的区别_滤波器国产 VS 国外
  5. htaccess是什么文件
  6. axios的http拦截
  7. 三层路由详解、为什么要划分vlan,vlan的作用是什么?
  8. 获取简单的输入和渲染窗口(Hello Window)
  9. java中文乱码转换编程_java中文乱码如何转换
  10. 20135202闫佳歆——信息安全系统设计基础第九周学习总结
  11. 干货分享——CAD动态块
  12. 【DP SDOI2008 BZOJ 2037】Sue的小球
  13. c语言对浮点数截断,C语言中浮点数精度进行截断输出
  14. 运维快速入门必备的 Linux 服务器安全简明指南,速收!
  15. js获取最新的省市区地址
  16. 几种颜色模型(颜色空间):HSV CMYK RGB
  17. python爬取豆瓣影评
  18. OpenSSL 使用拾遗(二)---- X509 证书的 SKID/AKID 字段
  19. 科普计算机知识的视频,知识短视频 科普更走心
  20. 圆形面积与周长(仅用于个人记录)

热门文章

  1. CVPR 2021 TrafficQA
  2. python搞机器视觉,掌控Python 人工智能之机器视觉
  3. 调节汉化版Eclipse的字体大小
  4. 变频电源基本控制电路系统
  5. 计算机基础应用课件,大学计算机基础应用课件
  6. 贪吃蛇代码--c语言版 visual c++6.0打开
  7. 五种常用手机Java编程软件
  8. C中字符串常量字符数组字符常量
  9. c语言字符串常量表达,C语言基础教程:字符常量和字符串常量
  10. 《多媒体技术与应用》练习题