MessageDigest简介
一.概述
MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
MessageDigest 对象开始被初始化。该对象通过使用 update()方法处理数据。任何时候都可以调用 reset()方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算。
对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。
MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
MessageDigest 对象开始被初始化。该对象通过使用 update()方法处理数据。任何时候都可以调用 reset()方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算。
对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。
1、public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
返回实现指定摘要算法的 MessageDigest 对象。
algorithm - 所请求算法的名称
2、public static MessageDigest getInstance(String algorithm,String provider) throws NoSuchAlgorithmException,NoSuchProviderException
返回实现指定摘要算法的 MessageDigest 对象。
algorithm - 所请求算法的名称
provider - 提供者的名称。
3、public void update(byte[] input)
使用指定的 byte 数组更新摘要。
4、public byte[] digest()
通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。
5、public static boolean isEqual(byte[] digesta,byte[] digestb)
比较两个摘要的相等性。做简单的字节比较。
注意:Provider可以通过 java.security.Security.getProviders() 方法获取已注册提供者列表。比较常用的有“SUN”
SUN提供的常用的算法名称有:
MD2
MD5
SHA-1
SHA-256
SHA-384
SHA-512
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( );
public class test_md5_1 {
public static void main(String[] args) {
//待加密的字符串
String myinfo = "abc123";
System.out.println("加密前字符串:"+myinfo);
try {
MessageDigest m1 = MessageDigest.getInstance("MD5");
m1.update(myinfo.getBytes());
byte[] digesta = m1.digest();
System.out.println("本信息摘要是:" + convertToHexString(digesta));
} catch (NoSuchAlgorithmException e) {
System.out.println("非法摘要算法");
}
}
/**
* 计算结果(byte数组)转换为字符串
*/
public static String convertToHexString(byte[] digesta) {
String result = "";
for (int i = 0; i < digesta.length; i++) {
//0xff & digesta[i] 取低8位
System.out.println("digesta["+i+"]:"+digesta[i]);
String temp = Integer.toHexString(0xff & digesta[i]);
result += temp;
}
return result;
}
}
执行结果:
加密前字符串:abc123
digesta[0]:-23
digesta[1]:-102
digesta[2]:24
digesta[3]:-60
digesta[4]:40
digesta[5]:-53
digesta[6]:56
digesta[7]:-43
digesta[8]:-14
digesta[9]:96
digesta[10]:-123
digesta[11]:54
digesta[12]:120
digesta[13]:-110
digesta[14]:46
digesta[15]:3
本信息摘要是:e99a18c428cb38d5f260853678922e3
ps:为什么取低8位?
Integer.toHexString();方法传入的值是int类型的,所以当传入byte的时候就会自动转换成int类型,又由于byte类型只占8位并且int类型占32位,所以会进行补位,如果byte是整数的话没什么影响,因为前面补的是0。但是如果是负数的话就会出现问题了,例如byte b = -112; byte的2进制表示为:1001 0000,java中是以补码的形式进行表示的,这样前面补满22位个1的时候就会出现很多f,所以取低8位。
接着仔细看下输出结果是31位。为什么会少一位,byte数组中有的值可能小于16,所以转换成16进制的时候用1位就可以表示了。这个时候我们应该在前面加上个0。
修改转换字符串的代码:
/**
* 计算结果(byte数组)转换为字符串
*/
public static String convertToHexString(byte[] digesta) {
String result = "";
for (int i = 0; i < digesta.length; i++) {
//0xff & digesta[i] 取低8位
String temp = Integer.toHexString(0xff & digesta[i]);
if(temp.length()==1){
temp = "0"+temp;
}
result += temp;
}
return result;
}
执行结果:
加密前字符串:abc123
digesta[0]:-23
digesta[1]:-102
digesta[2]:24
digesta[3]:-60
digesta[4]:40
digesta[5]:-53
digesta[6]:56
digesta[7]:-43
digesta[8]:-14
digesta[9]:96
digesta[10]:-123
digesta[11]:54
digesta[12]:120
digesta[13]:-110
digesta[14]:46
digesta[15]:3
本信息摘要是:e99a18c428cb38d5f260853678922e3
上面字节数组补码形式为:
-23|-102|24|-60|40|-53|56|-43|-14|96|-123|54|120|-110|46|3
11101001|10011010|00011000|11000100|00101000|11001011|00111000|11010101|11110010|01100000|10000101|00110110|01111000|0|00101110|0011
MessageDigest简介的更多相关文章
- MessageDigest简介(与MD5加密有关)
参考文章:http://blog.sina.com.cn/s/blog_4f36423201000c1e.html 参考来源:http://blog.csdn.net/hudashi/article/ ...
- WebUtils【MD5加密(基于MessageDigest)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 用于MD5加密,主要场景是在调用登录接口时对密码进行MD5加密处理. 效果图 暂不需要 代码分析 基于Java.security.M ...
- 一致性hash算法简介与代码实现
一.简介: 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance) 2.单调性(Monotonicity) 3.分散性(Spread) 4.负 ...
- C#中简单调用MD5方法以及MD5简介
MD5简介: MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.M ...
- DiskLruCache 硬盘缓存 使用简介
简介 LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时.对此,Google又提供了一套硬盘缓存的解决方案:DiskLru ...
- MessageDigest类
public abstract class MessageDigest extends MessageDigestSpi API中的中英文对照简介(未完) java.security.MessageD ...
- Java密码体系结构简介:Java Cryptography Architecture (JCA) Reference Guide
来自Java官方的文档,作备忘使用. 简介: Java平台非常强调安全性,包括语言安全,密码学,公钥基础设施,认证,安全通信和访问控制. JCA是平台的一个主要部分,包含一个“提供者”体系结构和一组用 ...
- MessageDigest类实现md5加密
项目中用到的md5工具类: package com.mall.util; import org.springframework.util.StringUtils; import java.securi ...
- LruCache DiskLruCache 缓存 简介 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- [HDOJ5943]Kingdom of Obsession(最大匹配,思路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:n个人编号为[s+1,s+n],有n个座位编号为[1,n],编号为i的人只能坐到编号为它的 ...
- TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 虚拟机guest为windows7的环境下安装破解版simplify3d_3.0.2
情形: 1.主机(host):ubuntu 2.虚拟机里安装的操作系统版本(guest):windows 7专业版 3.simplify3d破解版版本:3.0.2(破解需要的工具均在下文的百度云地址里 ...
- Python语言精要---上
下面的记录根据: 麦金尼. 利用Python进行数据分析[M]. 机械工业出版社, 2014. 这本教材的附录部分总结而来 Python的设计特点是重视可读性,简洁性以及明确性 Python不推荐 ...
- iOS - XML 数据解析
前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...
- iOS - UIGestureRecognizer
前言 NS_CLASS_AVAILABLE_IOS(3_2) @interface UIGestureRecognizer : NSObject @available(iOS 3.2, *) publ ...
- JS 拼装代码的HTML onClick方法传递字符串
有时会在JS中拼装HTML代码,这时在HTML中出现的onClick()方法中: 1.出现传递Num型的数据,直接拼装进去即可: 2.可能会出现传递字符串的情况,处理方法比较特殊,如下: a:直接字符 ...
- [转载] linux 程序运行过程中替换文件
今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”.结果朋友发来一个执行结果:(test正在运行中)# cp te ...
- [转载] 理解 rto
原文: http://mp.weixin.qq.com/s?__biz=MzAxNjM3MDkyOQ==&mid=204656491&idx=1&sn=5046aa16eee0 ...
- 三种实例化bean的方式
在spring中有三中实例化bean的方式: 一.使用构造器实例化:(90%通常使用的一个方法) 二.使用静态工厂方法实例化: 三.使用实例化工厂方法实例化. 每种实例化所采用的配置是不一样的: 一. ...