MessageDigest 详解
MessageDigest 通过其getInstance系列静态函数来进行实例化和初始化。MessageDigest 对象通过使用 update
方法处理数据。任何时候都可以调用 reset
方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest
方法之一完成哈希计算并返回结果。
对于给定数量的更新数据,digest
方法只能被调用一次。digest
方法被调用后,MessageDigest 对象被重新设置成其初始状态。
MessageDigest 的实现可随意选择是否实现 Cloneable 接口。客户端应用程可以通过尝试复制和捕获 CloneNotSupportedException 测试可复制性:
MessageDigest md = MessageDigest.getInstance("SHA"); try { md.update(toChapter1); MessageDigest tc1 = md.clone(); byte[] toChapter1Digest = tc1.digest(); md.update(toChapter2); ...etc. } catch (CloneNotSupportedException cnse) { throw new DigestException("couldn't make digest of partial content"); }
注意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?:falsemdTemp2==mdTemp3?:false
构造方法摘要 | |
---|---|
protected
|
MessageDigest(String algorithm) 创建具有指定算法名称的MessageDigest 实例对象。 |
方法摘要 | |
---|---|
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 MessageDigest getInstance(String algorithm)
public static MessageDigest getInstance(String algorithm, String provider);
public void update(byte[] input)
三、例子演示
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(x.getBytes("UTF8" ));
byte s[ ]=m.digest( );
900150983cd24fb0d6963f7d28e17f72
MessageDigest 详解相关推荐
- Android签名机制之---签名验证过程详解
一.前言 今天是元旦,也是Single Dog的嚎叫之日,只能写博客来祛除寂寞了,今天我们继续来看一下Android中的签名机制的姊妹篇:Android中是如何验证一个Apk的签名.在前一篇文章中我们 ...
- 钉钉实现企业级微应用免登陆详解
(一)基本概述: 钉钉中实现免登陆的核心思想就是通过corpId和corpSecret这两个参数来获得免登陆码Code,继而通过Code来获取用户信息,并在后台数据库中比对该用户信息是否存在,如果比对 ...
- 【java】JDK安全模块JCE核心Cipher使用详解
1.概述 转载:JDK安全模块JCE核心Cipher使用详解 2.前提 javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适.Cipher是JCA(Java Cryptograp ...
- MD5单向散列算法详解
历史: MD5 叫信息-摘要算法,是一种密码的算法,它可以对任何文件产生一个唯一的MD5验证码,每个文件的MD5码就如同每个人的指纹一样,都是不同的,这样,一旦这个文件在传输过程中,其内容被损坏或者被 ...
- Bitmap精炼详解第(三)节:Bitmap的压缩
一,前期基础知识储备 笔者之前有两篇文章:<Bitmap精炼详解第(一)节:Bitmap解析和加载><Bitmap精炼详解第(二)节:Bitmap常见处理方式>解释了一些Bit ...
- 【Java网络编程与IO流】Java之Java Servlet详解
Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...
- 微信公众号开通步骤详解
微信公众号开通步骤详解 微信服务验证 微信公众号接入第一步:开发URL指向的服务接口 开发接口 发布到外网能访问的服务 配置服务 设置白名单 微信服务验证 微信公众号接入第一步:开发URL指向的服务接 ...
- 常见的加密算法及详解都在这里!
加密算法,是现在每个软件项目里必须用到的内容.广泛应用在包括了用户登入.数字签名.数据传输等多个场合.那大家都知道那些呢?今天我把常见的加密算法全部整理在这里,供大家学习参考. 首先,大家要知道加密算 ...
- Android Apk加壳技术实战详解
前言 前几天面试了一家信息加密相关的公司,经过两轮面试原以为坐等HR,结果还有一个实践测试ORZ-面试这么多家公司,真心觉得这家公司很特殊,尤其是那个逻辑测试-算了,不扯远了,走回正题. 面试官加我Q ...
- 详解【负载均衡】(负载均衡算法、一致性hash、负载均衡架构分析)
作者:duktig 博客:https://duktig.cn 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 本文源码参看:https://github.com/duktig666/distribute ...
最新文章
- 暑期集训1:C++STL 例3:UVA-12100
- 解决UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte问题
- matlab讨论资金积累,资金积累、国民收入与人口增长的关系综合评估
- 科大星云诗社动态20210925
- 关于推荐和机器学习的几个网站
- 基于JAVA+SpringMVC+Mybatis+MYSQL的网上医院预约挂号系统
- Java中拦截器和过滤器的声明用途和区别
- java类中的static块_java类中static代码块的执行次数
- 提升交互设计必备的28本好书
- Django数据库的增删改查学习笔记
- 技术评审之技术文档的规范模板
- Flutter HotRealod详解
- 极智资讯 | 一文看尽今年的云栖大会 有哪些好玩的
- 一梦三四年——国产MOBA网游的巅峰
- 使用node实现向手机发送验证码
- HDU 6078 Wavel Sequence【动态规划】
- URL锚点HTML定位技术机制、应用与问题
- nvenc vs x264 对比(1)
- Linux兄弟连视频教程—B站评论区总结
- 出现Presentation Error的解决方法
热门文章
- gaussdb 安全维护【设置帐户权限】【02】
- 湘西州2021年高考成绩查询,2021年湘西高考状元名单公布,湘西文理科状元是谁多少分...
- excel数据库_EXCEL数据库DSUM DMAX DMIN DAVERAGE函数的用法
- 在线考试系统毕业设计设计过程及部分代码
- 微加速度计的原理与应用
- mysql批量导入csv数据_csv批量导入mysql命令
- CCS 软件使用经验四则
- UIControl详解
- Origin 2019b 图文安装教程及下载(附安装包)
- JavaScript高级程序设计知识点汇总