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);

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

MesageDigest getInstance("MD5");
MesageDigest getInstance("md5");
MesageDigest getInstance("mD5");

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

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

public void update(byte input);
public void update(byte[] input);
public void update(byte[] input, int offset, int len);

3,计算信息的摘要

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

public byte[] digest();
public byte[] digest(byte[] input);
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通用工具类。

import java.security.MessageDigest;public class MD5Util {private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};/*** 将1个字节(1 byte = 8 bit)转为 2个十六进制位* 1个16进制位 = 4个二进制位 (即4 bit)* 转换思路:最简单的办法就是先将byte转为10进制的int类型,然后将十进制数转十六进制*/private static String byteToHexString(byte b) {// byte类型赋值给int变量时,java会自动将byte类型转int类型,从低位类型到高位类型自动转换int n = b;// 将十进制数转十六进制if (n < 0)n += 256;int d1 = n / 16;int d2 = n % 16;// d1和d2通过访问数组变量的方式转成16进制字符串;比如 d1 为12 ,那么就转为"c"; 因为int类型不会有a,b,c,d,e,f等表示16进制的字符return hexDigits[d1] + hexDigits[d2];}/*** 将字节数组里每个字节转成2个16进制位的字符串后拼接起来*/private static String byteArrayToHexString(byte b[]) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++){resultSb.append(byteToHexString(b[i]));}return resultSb.toString();}/*** MD5算法,统一返回大写形式的摘要结果,默认固定长度是 128bit 即 32个16进制位* String origin :需要进行MD5计算的字符串* String charsetname :MD5算法的编码*/private static String MD5_32(String origin, String charsetname) {String resultString = null;try {// 1,创建MessageDigest对象MessageDigest md = MessageDigest.getInstance("MD5");// 2,向MessageDigest传送信息;传入的信息需要转化为指定编码的字节数组md.update(origin.getBytes( charsetname ));// 3,计算摘要byte[] bytesResult = md.digest();// 第2步和第3步可以合并成下面一步// byte[] bytesResult = md.digest(origin.getBytes(charsetname));// 4,将字节数组转换为16进制位resultString = byteArrayToHexString( bytesResult );} catch (Exception e) {e.printStackTrace();}// 统一返回大写形式的字符串摘要return resultString.toUpperCase();}/*** 获取 16位的MD5摘要,就是截取32位结果的中间部分*/private static String MD5_16(String origin, String charsetname) {return MD5_32(origin, charsetname).substring(8,24);}public static void main(String[] args){String origin = "1234567890";// 默认MD5计算得到128 bit的摘要,即32个 16进制位String result_32 = MD5_32(origin, "utf-8");System.out.println(result_32);  // E807F1FCF82D132F9BB018CA6738A19F// 获取16位的摘要String result_16 = MD5_16(origin, "utf-8");System.out.println(result_16);  // F82D132F9BB018CA}
}

2,没有调用update方法?

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

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

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

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

public byte[] digest(byte[] input) {update(input);return digest();
}

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

转载于:https://www.cnblogs.com/klory/p/10615172.html

MessageDigest类相关推荐

  1. java中的DES,AES,BASE64,MD5和Cipher类\MessageDigest类

    Cipher类位于javax.crypto包下,声明为 public class Cipher extends Object 此类为加密和解密提供密码功能.它构成了 Java Cryptographi ...

  2. Java的MessageDigest类、MD5算法

    什么是MD5算法 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash val ...

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

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

  4. MessageDigest简单介绍

    本文博客原文 參考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html 一.概述 java.security.MessageDigest类用于 ...

  5. java int相除向上取整_java实战项目常用类,Date、Calendar、BigDecimal、Math、UUID

    Java开发中经常用到的类和方法,以下主要就日期是时间处理.金融数字处理.数学计算.随机数.MD5加密等. java.util.Date类 java.util 包提供了 Date 类来封装当前的日期和 ...

  6. MessageDigest简介

    参考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html 一.概述 java.security.MessageDigest类用于为应用程序提供 ...

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

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

  8. 用Java获取文件的MD5校验和

    我正在寻找使用Java获取文件的MD5校验和. 我真的很惊讶,但是我找不到任何能显示如何获取文件的MD5校验和的东西. 怎么做? #1楼 Guava现在提供了一个新的,一致的哈希API,它比JDK中提 ...

  9. 2017-2018-2 20165211 实验五《网络编程与安全》实验报告

    实验五 网络编程与安全 课程:JAVA程序设计 班级:1652班 姓名:丁奕 学号:20165211 指导教师:娄嘉鹏 实验日期:2018.5.28 实验名称:网络编程与安全 具体实验步骤及问题 (一 ...

  10. java ltpa_LTPA Cookie原理

    1. 什么是LTPA? Lightweight Third-Party Authentication (LTPA)是IBM Websphere和Domino产品中使用单点登录技术.当服务器配置好LTP ...

最新文章

  1. python的数据清理_Python数据清理,清洗
  2. 08 友盟项目--拆分日志为五个表---UDTF自定义函数
  3. 华山论“件”:Kafka、RabbitMQ、RocketMQ技能大比拼
  4. Javascript浅谈之this
  5. git回退历史版本无法上传_Git实用教程(四) | Git本地库操作(查看提交历史、版本前进回退)...
  6. matlab全局变量_MATLAB笔记(一):工具箱的卸载、阻尼振动波形图程序
  7. python 的for与while 的i改变
  8. 计算机更新bios,升级bios,详细教您主板怎么更新bios
  9. 在MyEclipse中安装SVN插件subclipse
  10. Matlab2017a许可证问题:一直提示激活
  11. Python生成图文并茂的PDF报告
  12. 工作后出国留学经历总结
  13. Linux系统CentOS 7中安装配置JDK
  14. SFP+光纤模块使用
  15. 怎样计算期货交易盈亏(期货交易盈利怎么算)
  16. led屏背后线路安装图解_科普:网格屏是什么意思?LED网格屏怎么安装
  17. RF自动化测试系列-第三篇 测试数据
  18. 如何让jar包显示Java图标
  19. python已知两条直角边求斜边,Python实现“已知三角形两个直角边,求斜边”
  20. 亚马逊获取买家信息,店铺申请,ERP系统,MWS迁移SPAPI,SPAPI注册,PII权限获取

热门文章

  1. ssm毕设项目住宅小区停车管理系统494ak(java+VUE+Mybatis+Maven+Mysql+sprnig)
  2. 联想小新Pad救砖(9008刷机)
  3. SpringBoot实现万能文件在线预览
  4. 2016最新微信公众号运营必备网址大全
  5. 华为网络技术大赛笔记——存储器基础原理
  6. 完成图书管理系统类图的绘制_如何在线免费绘制各类图形
  7. QT通过ODBC连接MySQL数据库
  8. Docker环境调优
  9. cocos2dx 插件Babelua的配置和使用
  10. java__斐波那契数列