MessageDigest 类的用法
MessageDigest 类
MessageDigest 类是一个引擎类,它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的。密码上安全的报文摘要可接受任意大小的输入(一个字节数组),并产生固定大小的输出,该输出称为一个摘要或散列。摘要具有以下属性:
- 无法通过计算找到两个散列成相同值的报文。
- 摘要不反映任何与输入有关的内容。
使用报文摘要可以生成数据唯一且可靠的标识符。有时它们被称为数据的“数字指纹”。
创建 MessageDigest 对象
计算摘要的第一步是创建报文摘要实例。象所有的引擎类一样,获取某类报文摘要算法的 MessageDigest 对象的途径是调用 MessageDigest 类中的 getInstance 静态 factory 方法:
public static MessageDigest getInstance(String algorithm)注意:算法名不区分大小写。例如,以下所有调用都是相等的:
MessageDigest.getInstance("SHA") MessageDigest.getInstance("sha") MessageDigest.getInstance("sHa")调用程序可选择指定提供者名称,以保证所要求的算法是由已命名提供者实现的:
public static MessageDigest getInstance(String algorithm, String provider)调用 getInstance 将返回已初始化过的报文摘要对象。因此,它不需要进一步的初始化。
更新报文摘要对象
计算数据的摘要的第二步是向已初始化的报文摘要对象提供数据。这将通过一次或多次调用以下某个 update(更新)方法来完成:
public void update(byte input) public void update(byte[] input) public void update(byte[] input, int offset, int len)计算摘要
通过调用 update 方法提供数据后,程序就调用以下某个 digest(摘要)方法来计算摘要:
public byte[] digest() public byte[] digest(byte[] input) public int digest(byte[] buf, int offset, int len)前两个方法返回计算出的摘要。后一个方法把计算出的摘要储存在所提供的 buf 缓冲区中,起点是 offset。len 是 buf 中分配给该摘要的字节数。该方法返回实际存储在buf 中的字节数。
对接受输入字节数组变量的 digest 方法的调用等价于用指定的输入调用:
public void update(byte[] input),接着调用不带参数的 digest 方法.
示例一:
★ 编程思路:
java.security包中的MessageDigest类提供了计算消息摘要的方法,首先生成对象,执行其update( )方法可
以将原始数据传递给该对象,然后执行其digest( )方法即可得到消息摘要。具体步骤如下:
(1)生成MessageDigest对象
MessageDigest m=MessageDigest.getInstance("MD5");
分析:和2.2.1小节的KeyGenerator类一样。MessageDigest类也是一个工厂类,其构造器是受保护的,不允许
直接使用new MessageDigist( )来创建对象,而必须通过其静态方法getInstance( )生成MessageDigest对象。
其中传入的参数指定计算消息摘要所使用的算法,常用的有"MD5","SHA"等。若对MD5算法的细节感兴趣可参考
http://www.ietf.org/rfc/rfc1321.txt。
(2)传入需要计算的字符串
m.update(x.getBytes("UTF8" ));
分析:x为需要计算的字符串,update传入的参数是字节类型或字节类型数组,对于字符串,需要先使用
getBytes( )方法生成字符串数组。
(3)计算消息摘要
byte s[ ]=m.digest( );
分析:执行MessageDigest对象的digest( )方法完成计算,计算的结果通过字节类型的数组返回。
(4)处理计算结果
必要的话可以使用如下代码将计算结果s转换为字符串。
String result="";
for (int i=0; i
result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);
}
★代码与分析:
完整程序如下:import java.security.*; public class DigestPass{ public static void main(String args[ ]) throws Exception{String x=args[0];MessageDigest m=MessageDigest.getInstance("MD5");m.update(x.getBytes("UTF8"));byte s[ ]=m.digest( );String result="";for (int i=0; iresult+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6);}System.out.println(result);}}
★运行程序
输入java DigestCalc abc来运行程序,其中命令行参数abc是原始数据,屏幕输出计算后的消息摘要:
900150983cd24fb0d6963f7d28e17f72。
示例二:
public String EncoderByMd5(String str) throws NoSuchAlgorithmException,
UnsupportedEncodingException{
//确定计算方法
MessageDigest md5=MessageDigest.getInstance("MD5");
BASE64Encoder base64en = new BASE64Encoder();
//加密后的字符串
String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
return newstr;
}调用函数:String str="0123456789"System.out.println(EncoderByMd5(str));
输出:eB5eJF1ptWaXm4bijSPyxw==
MessageDigest 类的用法相关推荐
- python 包用法_Python 基础教程之包和类的用法
Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...
- 【ES6】JS类的用法class
[ES6]JS类的用法class 一.概述 二.构造函数constructor 三.静态方法与静态变量 查看更多ES6教学文章: 参考文献 引言:由于JS之前一直没有特有的class来定义类的语法,E ...
- string类具体用法
string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...
- php分析图片水印,PHP开发的文字水印,缩略图,图片水印实现类与用法示例
本文实例讲述了PHP开发的文字水印,缩略图,图片水印实现类与用法.分享给大家供大家参考,具体如下: 1.实现类ImageToTest.class.php参考代码 class ImageToTest { ...
- Android -------GestureDetector类的用法
GestureDetector类的用法 2010-10-18 14:39:02| 分类: android|字号 订阅 GestureDetector类定义了许多触摸事件.包括 1.boole ...
- Handle类的用法
android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无 ...
- 【Kotlin】Kotlin enum 枚举类 ( 常用用法 | 初始化成员变量 | 实现抽象方法 | 实现接口 | 获取名称和位置索引 | 调用枚举常量方法 )
文章目录 I . 枚举类常用用法 II . 枚举类初始化 III. 枚举类匿名类 IV . 枚举类实现接口 V . 获取枚举常量名称和位置索引 VI . 获取枚举常量的成员变量 VII . 调用枚举常 ...
- jsonutil java_Java实现的JSONUtil工具类与用法示例
本文实例讲述了Java实现的JSONUtil工具类与用法.分享给大家供大家参考,具体如下: import java.util.HashMap; import java.util.Map; import ...
- as3corelib系列教程之一:ArrayUtil类的用法
as3corelib是一个非常不错的开源开发包,里面封装的类用起来都非常方便,不过可惜的是放出来的下载包里面只有一个关于JSON的Sample,这对于初学者尤其是Flex初学者来说相当的不方便.感谢H ...
- C#中timer类的用法
C#中timer类的用法 关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类 ...
最新文章
- 面向过程和面向对象的区别(转)
- getDeclaredField(x);与set方法的用法
- Java 语言中十大“坑爹”功能!
- 计算机操作鉴定所需设备,计算机操作员职业技能鉴定标准(高级)
- java简单的for循环多线程
- SharePoint 使用脚本为表单绑定事件
- hapi返回xml格式 微信开发 node
- EOS1.1版本新特性介绍
- HDU 5533 Dancing Stars on Me( 有趣的计算几何 )
- MobaXterm 中文乱码问题
- 生产环境服务器部署kvm虚拟化6,KVM虚拟化平台环境部署
- STM32选型与命名规则
- 计算机管理磁盘分区,一分钟搞定电脑磁盘分区,再也不求人!
- 从零开始的小白pr学习之旅--day2 数字后端流程(一)
- JavaSrcipt学习(学习打卡Day4)
- 获益匪浅:在北京每月能白捡一万元
- FFmpeg 源码之内存管理函数族
- java 1.13 快照下载_Minecraft Java快照版18w15a下载
- uniapp开发聊天APP踩坑记录
- 关于使用cin的返回值终止循环输入