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 ...
随机推荐
- ServiceStack.OrmLite 笔记9 -code first 必须的代码优先
复杂点的使用3 code first的使用,支持复杂类型 public enum PhoneType { Home, Work, Mobile, } public enum AddressType { ...
- poj 3304线段与直线相交
http://poj.org/problem?id=3304 Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: ...
- java中判断用户是否为第一次登陆(在页面上进行控制)
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%&g ...
- asp.netMVC4(基础知识----传值问题分析)
(1)一般在数据交互的时候,都会涉及到前后台间的相互传值,一般的情况下,方法也有多种,下面就后台定义变量往前台传值: 以下是后台代码: /// <summary> /// 展示举报信息 / ...
- ubuntu_杂
1. 虚拟机安装的 ubuntu 12.04,在关闭了 一段时间不操作就屏保 和 锁屏 之后, 在一段时间之后 虚拟机的屏幕还是变黑了,貌似是 os将 显示器关闭了. 这个相关的设置是在哪里? 相关设 ...
- [转载] linux cgroup
原文: http://coolshell.cn/articles/17049.html 感谢左耳朵耗子的精彩文章. 前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要 ...
- 在PC端或移动端应用中接入商业QQ的方法
今天看博友的博客学习了一种很有用的方法: 在页面中需要接入企业的QQ,访问网址:http://shang.qq.com/widget/consult.php.(就是API接口),然后你只需要登录你的Q ...
- Python中的join()函数split()函数
函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的 ...
- hdu5823(反演dp)
听说3^n也能水过去.. 其实应该是个经典题,求图染色这个np问题. 把问题拆成独立集来进行dp可以在3^n之内水过去. 拆成独立集的时候就发现,等价与一个经典的反演dp问题 然后复杂度就变成了 n* ...
- Html表单的正则校验--将不符合指定正则表达式的字符串自动替换为空
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...