public abstract class MessageDigest extends MessageDigestSpi

API中的中英文对照简介(未完)

java.security.MessageDigest class provides applications the functionality of a message digest algorithm, such as MD5、SHA-1 or SHA-256.

java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能,如 MD5 、 SHA -1或SHA-256算法。(简单点说就是用于生成散列码???)

Message digests are secure one-way hash functions that take arbitrary-sized data and output a fixed-length hash value.

信息摘要是安全的单向哈希函数,它接收随意大小的数据,输出固定长度的哈希值。

A MessageDigest object starts out initialized.

MessageDigest 开始初始化。

The data is processed through it using the update methods.

(MessageDigest 对象)通过使用 update 方法处理数据。

At any point reset can be called to reset the digest.

不论什么时候都能够调用 reset 方法重置摘要。

Once all the data to be updated has been updated, one of the digest methods should be called to complete the hash computation.

一旦全部须要更新的数据都已经被更新了,应该调用 digest方法之中的一个完毕哈希计算并返回结果。

The digest method can be called once for a given number of updates.

对于给定数量的更新数据,digest 方法仅仅能被调用一次。

After digest has been called, the MessageDigest object is reset to its initialized state.

digest 方法被调用后,MessageDigest  对象被又一次设置成其初始状态。

MessageDigest类使用注意事项:

1、由于MessageDigest 类的构造函数是protected修饰的,无法在java.security包外实例化。所以通过public static MessageDigest getInstance(String algorithm) 系列的静态方法(即类方法)来进行实例化和初始化

2、需要先调用update方法,向MessageDigest传送信息;传入的信息需要转化为指定编码的字节数组

DEMO

  1. String str = "123lkhu";
  2. try {
  3. MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  4. messageDigest.update(str.getBytes());
  5. byte[] by = messageDigest.digest();
  6. // MD5加密后的信息摘要,直接调用String的有参构造打印会乱码
  7. // System.out.println(new String(by));
  8. // MD5加密后的信息摘要可能超出int的取值范围,所以用BigInteger类去转换成字符串
  9. BigInteger bigInteger = new BigInteger(1, by);//参数1代表正数
  10. String string = bigInteger.toString(16);//参数是进制
  11. System.out.println(string);
  12. } catch (NoSuchAlgorithmException e) {
  13. e.printStackTrace();
  14. }

MD5的不可逆性的原因:

MD5不可逆的原因是由于它是一种散列函数(也叫哈希函数,哈希函数又称散列函数,杂凑函数,他是一个单向密码体制,即从明文到密文的不可逆映射,只有加密过程没有解密过程,哈希函数可以将任意长度的输入经过变化后得到固定长度的输出,这个固定长度的输出称为原消息的散列或消息映射。 理想的哈希函数可以针对不同的输入得到不同的输出,如果存在两个不同的消息得到了相同的哈希值,那我们称这是一个碰撞),使用的是hash算法,在计算过程中原文的部分信息是丢失了的。一个MD5理论上是可以对应多个原文的,因为MD5是有限多个而原文是无限多个的。

MD5码128位2进制数,最多有2^128种可能但是字符串的数量显然是有无数种可能的。

原文:https://blog.csdn.net/MyOracleFei/article/details/79487870

(一)基本介绍

Java的MessageDigest 类 可以提供MD5算法或SHA算法用于计算出信息的摘要;它接收任意大小的信息,并输出计算后的固定长度的哈希值。这个输出的哈希值就是我们所说的信息摘要。

MD5算法得到的摘要是固定长度为 128 bit 的二进制串(一堆0和1,一共128个),为了更友好的表示摘要,一般都将 128位的二进制串 转为 32个16进制位16个16进制位 如下:

(二)16位的摘要?

MD5算法得到的摘要固定长度为 128 bit 也就是32个16进制位(32位摘要),那么怎么得到16位的摘要呢? 其实从上面的表格中可以看出,16位的摘要是32位摘要值的中间部分,即32位摘要中第8~24位的部分。

(三)MessageDigest类计算MD5摘要的步骤

1,创建MessageDigest对象

public static MesageDigest getInstance(String algorithm);

算法名不区分大小写,所以下面的写法都是正确的:

  1. MesageDigest getInstance("MD5");
  2. MesageDigest getInstance("md5");
  3. MesageDigest getInstance("mD5");

2,向MessageDigest传送要计算的数据

该步骤就是调用下面的某个方法来完成信息的传递。

  1. public void update(byte input);
  2. public void update(byte[] input);
  3. public void update(byte[] input, int offset, int len);

3,计算信息的摘要

最后调用下面的某个方法来计算摘要。

  1. public byte[] digest();
  2. public byte[] digest(byte[] input);
  3. public int digest(byte[] buf,int offset,int len);

4,将摘要转为16进制位的字符串

为了更友好的表示摘要,一般都将 128位的二进制串 转为 32个16进制位16个16进制位 ,并以字符串的形式表示。

摘要一般以字符串的形式展示,所以在WEB应用中,用于表示密码的MD5摘要的数据库字段一般设置为String类型String password(虽然字段名字面意思表示账户密码,但实际上只是账户密码的MD5摘要)。

虽然字段名的字面意思表示账户密码,但实际上只是账户密码的MD5摘要,参考 摘要与加密的区别(以MD5算法为例)

(四)基于MessageDigest类的MD5通用工具类实现

实现MD5通用工具类的方法有很多,下面我用清晰明了的代码去实现MD5Util通用工具类。

  1. import java.security.MessageDigest;
  2.  
  3. public class MD5Util {
  4.  
  5. private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
  6. "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
  7.  
  8. /**
  9. * 将1个字节(1 byte = 8 bit)转为 2个十六进制位
  10. * 1个16进制位 = 4个二进制位 (即4 bit)
  11. * 转换思路:最简单的办法就是先将byte转为10进制的int类型,然后将十进制数转十六进制
  12. */
  13. private static String byteToHexString(byte b) {
  14. // byte类型赋值给int变量时,java会自动将byte类型转int类型,从低位类型到高位类型自动转换
  15. int n = b;
  16.  
  17. // 将十进制数转十六进制
  18. if (n < 0)
  19. n += 256;
  20. int d1 = n / 16;
  21. int d2 = n % 16;
  22.  
  23. // d1和d2通过访问数组变量的方式转成16进制字符串;比如 d1 为12 ,那么就转为"c"; 因为int类型不会有a,b,c,d,e,f等表示16进制的字符
  24. return hexDigits[d1] + hexDigits[d2];
  25. }
  26.  
  27. /**
  28. * 将字节数组里每个字节转成2个16进制位的字符串后拼接起来
  29. */
  30. private static String byteArrayToHexString(byte b[]) {
  31. StringBuffer resultSb = new StringBuffer();
  32. for (int i = 0; i < b.length; i++){
  33. resultSb.append(byteToHexString(b[i]));
  34. }
  35. return resultSb.toString();
  36. }
  37.  
  38. /**
  39. * MD5算法,统一返回大写形式的摘要结果,默认固定长度是 128bit 即 32个16进制位
  40. * String origin :需要进行MD5计算的字符串
  41. * String charsetname :MD5算法的编码
  42. */
  43. private static String MD5_32(String origin, String charsetname) {
  44. String resultString = null;
  45. try {
  46. // 1,创建MessageDigest对象
  47. MessageDigest md = MessageDigest.getInstance("MD5");
  48. // 2,向MessageDigest传送信息;传入的信息需要转化为指定编码的字节数组
  49. md.update(origin.getBytes( charsetname ));
  50. // 3,计算摘要
  51. byte[] bytesResult = md.digest();
  52.  
  53. // 第2步和第3步可以合并成下面一步
  54. // byte[] bytesResult = md.digest(origin.getBytes(charsetname));
  55.  
  56. // 4,将字节数组转换为16进制位
  57. resultString = byteArrayToHexString( bytesResult );
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61. // 统一返回大写形式的字符串摘要
  62. return resultString.toUpperCase();
  63.  
  64. }
  65.  
  66. /**
  67. * 获取 16位的MD5摘要,就是截取32位结果的中间部分
  68. */
  69. private static String MD5_16(String origin, String charsetname) {
  70. return MD5_32(origin, charsetname).substring(8,24);
  71. }
  72.  
  73. public static void main(String[] args){
  74. String origin = "1234567890";
  75.  
  76. // 默认MD5计算得到128 bit的摘要,即32个 16进制位
  77. String result_32 = MD5_32(origin, "utf-8");
  78. System.out.println(result_32); // E807F1FCF82D132F9BB018CA6738A19F
  79.  
  80. // 获取16位的摘要
  81. String result_16 = MD5_16(origin, "utf-8");
  82. System.out.println(result_16); // F82D132F9BB018CA
  83. }
  84. }

2,没有调用update方法?

  1. byte[] bytesResult = md.digest(origin.getBytes(charsetname));

在这种写法中并没有代码显式地调用update方法,但跟下面的写法是一样的,实际上也调用了update方法:

  1. // 2,向MessageDigest传送信息;传入的信息需要转化为指定编码的字节数组
  2. md.update(origin.getBytes( charsetname ));
  3. // 3,计算摘要
  4. byte[] bytesResult = md.digest();

查看该digest(byte[] input)方法的源码,可以看到该方法其实就是将第2步和第3步封装成一个函数而已。

  1. public byte[] digest(byte[] input) {
  2. update(input);
  3. return digest();
  4. }

转载地址:https://juejin.im/post/5a7fa2e06fb9a063435ed40b

 

MessageDigest类的更多相关文章

  1. MessageDigest 类

    MessageDigest 类    MessageDigest 类是一个引擎类,它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的.密码上安全的报文摘要可接受任意大小的输入( ...

  2. Java 自带的加密类MessageDigest类(加密MD5和SHA)

    Java 自带的加密类MessageDigest类(加密MD5和SHA) - X-rapido的专栏 - CSDN博客 https://blog.csdn.net/xiaokui_wingfly/ar ...

  3. 【转】java MessageDigest类的作用 :提供信息摘要 算法( MD5 或 SHA 等)的功能

    一.结构和概述: java.lang.Object java.security.MessageDigestSpi java.security.MessageDigest 声明:public abstr ...

  4. MessageDigest类实现md5加密

    项目中用到的md5工具类: package com.mall.util; import org.springframework.util.StringUtils; import java.securi ...

  5. JAVA 中的MessageDigest类和Mac类的使用

    MessageDigest 消息摘要 例子: MD5加密: try{ MessageDigest md5 = MessageDigest.getInstance("MD5"); m ...

  6. MessageDigest类提供MD5或SHA等加密算法

    MessageDigest可使用的加密方法有MD2\MD5\SHA-1\SHA-256\SHA-384\SHA-512,使用时候只替换相应参数值即可 MessageDigest md5 = Messa ...

  7. MessageDigest消息摘要

    <1>MessageDigest基础 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法. MessageDigest 对象开始被初始化.该对象通 ...

  8. MessageDigest简介

    一.概述 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值. MessageDi ...

  9. Java利用MessageDigest提供的MD5算法加密字符串或文件

    MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性.用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm).另外还有一种常用的消息摘要算法SHA1.如果想了 ...

随机推荐

  1. 数据结构之表(C语言实现)

    抽象数据类型 (abstract data type,ADT) 抽象数据类型是一些操作的集合.抽象数据类型是数学中的定义,在ADT中,我们不关心操作是如何被实现的.因此,这可以看做是模块化的扩充.例如 ...

  2. DotNetCore跨平台~EFCore数据上下文的创建方式

    回到目录 对于DotNetCore来说,把大部分组件者放在DI容器里,在startup中进行注入,在类的构造方法中进行使用,如果某些情况下,无法使用这种DI的方式,也可以自己控制数据上下文的生产过程, ...

  3. [翻译] EF Core in Action 关于这本书

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  4. 试试使用 eolinker 扫描 GitLab 代码注释自动生成 API 文档?

    前言: 一般写完代码之后,还要将各类参数注解写入API文档,方便后续进行对接和测试,这个过程通常都很麻烦,如果有工具可以读取代码注释直接生成API文档的话,那会十分方便. 此前一直都是在使用eolin ...

  5. 详解TypScript数据类型转换

    最近在用TypeScript(后面简称TS),发现TS虽然语法和C#差不多但是在很多地方还是不够高级(和C#相比),这里主要聚焦在数据类型强转上面,直接看下面案例吧 string转number 案例如 ...

  6. 【大数据安全】CDH集群禁用Kerberos

    在调试Kerberos的时候可能会有需要禁用的场景.以下是各组件禁用Kerberos的相关配置. 环境 CDH版本:5.11.2 Linux版本:7.4.1708 Docker版本:Docker ve ...

  7. 第三节:dingo/API 最新版 V2.0 之 Creating API Endpoints (连载)

    对于这篇文章的标题,其实,直译就是创建api端点.但是,真的很难懂,我还是写为API路由吧.每篇,文章,我都会全部去进行实践操作,力求写一个好点的教程. 本文英文地址——>https://git ...

  8. Eureka配置instanceId显示IP

    直接配置: eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-add ...

  9. C#工具:WPF分页

    1.使用ItemsControl控件 <UserControl x:Class="SunCreate.Vipf.Client.UI.CityDoor.PageControl" ...

  10. IT企业级应⽤开发模式演化

    前端研发流程 传统To B类系统的研发模式 探索 & 思考设计模式库(DPL)设计语⾔设计语⾔详解基于MVVM模式的Web框架 & UI库优化后的开发模式实现价值实践 赋能 赋能授权( ...