Java Cryptography Architecture,Java加密架构,java平台中用于访问和开发加密功能的框架。

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 缓冲区中,起点是 offsetlen 是 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 类的用法相关推荐

  1. python 包用法_Python 基础教程之包和类的用法

    Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...

  2. 【ES6】JS类的用法class

    [ES6]JS类的用法class 一.概述 二.构造函数constructor 三.静态方法与静态变量 查看更多ES6教学文章: 参考文献 引言:由于JS之前一直没有特有的class来定义类的语法,E ...

  3. string类具体用法

    string类具体用法 二话不说上代码 #include<string> #include<iostream> #include<algorithm> using ...

  4. php分析图片水印,PHP开发的文字水印,缩略图,图片水印实现类与用法示例

    本文实例讲述了PHP开发的文字水印,缩略图,图片水印实现类与用法.分享给大家供大家参考,具体如下: 1.实现类ImageToTest.class.php参考代码 class ImageToTest { ...

  5. Android -------GestureDetector类的用法

    GestureDetector类的用法 2010-10-18 14:39:02|  分类: android|字号 订阅 GestureDetector类定义了许多触摸事件.包括     1.boole ...

  6. Handle类的用法

    android中Handle类的用法 当我们在处理下载或是其他需要长时间执行的任务时,如果直接把处理函数放Activity的OnCreate或是OnStart中,会导致执行过程中整个Activity无 ...

  7. 【Kotlin】Kotlin enum 枚举类 ( 常用用法 | 初始化成员变量 | 实现抽象方法 | 实现接口 | 获取名称和位置索引 | 调用枚举常量方法 )

    文章目录 I . 枚举类常用用法 II . 枚举类初始化 III. 枚举类匿名类 IV . 枚举类实现接口 V . 获取枚举常量名称和位置索引 VI . 获取枚举常量的成员变量 VII . 调用枚举常 ...

  8. jsonutil java_Java实现的JSONUtil工具类与用法示例

    本文实例讲述了Java实现的JSONUtil工具类与用法.分享给大家供大家参考,具体如下: import java.util.HashMap; import java.util.Map; import ...

  9. as3corelib系列教程之一:ArrayUtil类的用法

    as3corelib是一个非常不错的开源开发包,里面封装的类用起来都非常方便,不过可惜的是放出来的下载包里面只有一个关于JSON的Sample,这对于初学者尤其是Flex初学者来说相当的不方便.感谢H ...

  10. C#中timer类的用法

    C#中timer类的用法 关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类 ...

最新文章

  1. 面向过程和面向对象的区别(转)
  2. getDeclaredField(x);与set方法的用法
  3. Java 语言中十大“坑爹”功能!
  4. 计算机操作鉴定所需设备,计算机操作员职业技能鉴定标准(高级)
  5. java简单的for循环多线程
  6. SharePoint 使用脚本为表单绑定事件
  7. hapi返回xml格式 微信开发 node
  8. EOS1.1版本新特性介绍
  9. HDU 5533 Dancing Stars on Me( 有趣的计算几何 )
  10. MobaXterm 中文乱码问题
  11. 生产环境服务器部署kvm虚拟化6,KVM虚拟化平台环境部署
  12. STM32选型与命名规则
  13. 计算机管理磁盘分区,一分钟搞定电脑磁盘分区,再也不求人!
  14. 从零开始的小白pr学习之旅--day2 数字后端流程(一)
  15. JavaSrcipt学习(学习打卡Day4)
  16. 获益匪浅:在北京每月能白捡一万元
  17. FFmpeg 源码之内存管理函数族
  18. java 1.13 快照下载_Minecraft Java快照版18w15a下载
  19. uniapp开发聊天APP踩坑记录
  20. 关于使用cin的返回值终止循环输入

热门文章

  1. coreldraw sp2精简版 x4_coreldraw x4 sp2 精简版
  2. Web页面iOS真机调试-win10
  3. 2022年认证杯SPSSPRO杯数学建模A题(第二阶段)人员的紧急疏散求解全过程文档及程序
  4. root魅族android6,魅族PRO6怎么ROOT ROOT权限获取方法教程
  5. app商品详情原数据 API ——淘宝/天猫
  6. Android逆向:某鹰直播Lua脚本解密
  7. 在线考试系统详细设计
  8. Neo4j下载(linux系统)
  9. C51单片机LCD1602驱动程序
  10. Java编程输出你的年龄和姓名