• MessageDigest使用 完成MD5加密


    Java 加密技术:消息摘要。

    一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。

    消息摘要有两个基本属性:

    两个不同的报文难以生成相同的摘要 难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要 代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5

    类 java.security.MessageDigest

    java.lang.Object | +----java.security.MessageDigest

    public abstract class MessageDigest
    extends Object

    MessageDigest 提供了消息摘要算法,如 MD5 或 SHA,的功能。消息摘要是安全单向散列函数,它采用任意大小的数据并输出一个固定长度的散列值。

    象 Java 安全性中的其它基于算法的类一样,MessageDigest 有两个主要的组件:

    消息摘要 API ( 应用程序接口 )
    这是需要消息摘要服务的应用调用的方法的接口。这个 API 由所有公有方法组成。
    消息摘要 SPI ( 服务提供者接口 )
    该接口是由提供特殊算法的提供者实现的接口。它由所有名字前缀为 engine 的方法组成。每个这样的方法由具有相应名字的公有 API 方法调用。例如,engineReset 方法由 reset 方法调用。SPI 方法是抽象的;提供者必须提供一个具体的实现。

    MessageDigest 对象在启动时被初始化。使用 update 方法处理数据。在任何地方都可调用 reset 复位摘要。一旦所有需要修改的数据都被修改了,将调用一个 digest 方法完成散列码的计算。

    对于给定次数的修改,只能调用 digest 方法一次。在调用 digest 之后,MessageDigest 对象被复位为初始化的状态。

    可以自由的实现 Cloneable 接口,这样做将会使客户应用在复制前用 instanceof Cloneable 测试可复制性:

     MessageDigest md = MessageDigest.getInstance("SHA");
    if (md instanceof Cloneable) {
      md.update(toChapter1);
      MessageDigest tc1 = md.clone();
      byte[] toChapter1Digest = tc1.digest;
      md.update(toChapter2); ...etc.
    } else {
      throw new DigestException("couldn't make digest of partial content");
    }

    注意如果给定的实现是不可复制的,如果事先知道摘要的数目,仍然能以几个实例为例计算中间的摘要。

    构造子

    MessageDigest

     protected MessageDigest(String algorithm)
    用指定的算法名创建一个消息摘要。
    参数:
    algorithm - 摘要算法的标准字符串名。 Java 密码结构 API 说明书 & 参考的附录 A。 -->

    方法

    getInstance

     public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException 
    生成一个 MessageDigest 对象,它实现指定的摘要算法。 如果缺省的提供者包包含一个实现了该算法 MessageDigest 子类,则返回该子类的一个实例。如果算法在缺省包中是不可用的,将搜索其它的包。
    参数:
    algorithm - 申请的算法名。 Java 密码结构 API 说明书 & 参考 的附录 A。 -->
    返回值:
    一个实现指定算法的 Message Digest 对象。
    抛出: NoSuchAlgorithmException
    如果算法在调用者环境中是不可用的。

    getInstance

     public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException 
    生成一个 MessageDigest 对象,实现指定的算法,如果提供者的算法是可用的,那么该算法由该提供者提供。
    参数:
    algorithm - 申请的算法名。 Java 密码结构 API 说明书 & 参考 的附录 A。 -->
    provider - 提供者的名字。
    返回值:
    一个实现指定算法的 Message Digest 对象。
    抛出: NoSuchAlgorithmException
    如果算法在申请的调用者提供的包中是不可用的。
    抛出: NoSuchProviderException
    如果提供者在环境中是不可用的。
    参见:
    Provider

    update

     public void update(byte input)
    用指定的字节修改该摘要。
    参数:
    input - 用于修改摘要的字节。

    update

     public void update(byte input[], int offset, int len)
    从数组指定的偏移量开始,用指定的字节数组修改摘要。
    参数:
    input - 该字节数组。
    offset - 字节数组中开始的偏移量。
    len - 从 offset 开始用的字节数。

    update

     public void update(byte input[])
    用指定的字节数组修改该摘要。
    参数:
    input - 该字节数组。

    digest

     public byte[] digest()
    通过执行最后的诸如填充的操作完成散列码的计算。 在调用之后复位该摘要。
    返回值:
    存放结果散列值的字节数组。

    digest

     public byte[] digest(byte input[])
    使用指定的字节数组执行对摘要最后的修改,然后完成摘要计算。 即,这个方法首先对数组调用 update,然后调用 digest()

    MessageDigest使用 <wbr>完成MD5加密MessageDigest使用 <wbr>完成MD5加密

    参数:
    input - 在摘要计算完成之前用于修改的输入值。
    返回值:
    结果散列值的字节数组。

    toString

     public String toString()
    返回该消息摘要对象的字符串表示。
    覆盖:
    Object 中的 toString

    isEqual

     public static boolean isEqual(byte digesta[], byte digestb[])
    比较两个摘要是否相同。 进行简单的比较。
    参数:
    digesta - 要比较的一个摘要。
    digestb - 要比较的另一个摘要。
    返回值:
    如果两个摘要相等则为 true ,否则为 false。

    reset

     public void reset()
    为将来的使用复位该摘要。

    一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。

    消息摘要有两个基本属性:

    两个不同的报文难以生成相同的摘要 难以对指定的摘要生成一个报文,而由该报文反推算出该指定的摘要 代表:美国国家标准技术研究所的SHA1和麻省理工学院Ronald Rivest提出的MD5.

    消息摘要MD5和SHA的使用 使用方法:

    首先用生成一个MessageDigest类,确定计算方法

    java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");

    添加要进行计算摘要的信息

    alga.update(myinfo.getBytes());

    计算出摘要

    byte[] digesta=alga.digest();

    发送给其他人你的信息和摘要

    其他人用相同的方法初始化,添加信息,最后进行比较摘要是否相同

    algb.isEqual(digesta,algb.digest())

    相关AIP

    java.security.MessageDigest 类

    static getInstance(String algorithm)

    返回一个MessageDigest对象,它实现指定的算法

    参数:算法名,如 SHA-1 或MD5

    void update (byte input)

    void update (byte[] input)

    void update(byte[] input, int offset, int len)

    添加要进行计算摘要的信息

    byte[] digest()

    完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位)

    void reset()

    复位

    static boolean isEqual(byte[] digesta, byte[] digestb)

    比效两个摘要是否相同

    代码: import java.security.*;

    public class myDigest { public static void main(String[] args) {

    myDigest my = new myDigest(); my.testDigest(); }

    public void testDigest() { try { String myinfo = "我的测试信息";

    // java.security.MessageDigest // alg=java.security.MessageDigest.getInstance("MD5"); java.security.MessageDigest alga = java.security.MessageDigest .getInstance("SHA-1"); alga.update(myinfo.getBytes()); byte[] digesta = alga.digest(); System.out.println("本信息摘要是:" + byte2hex(digesta)); // 通过某种方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常 java.security.MessageDigest algb = java.security.MessageDigest .getInstance("SHA-1"); algb.update(myinfo.getBytes()); if (algb.isEqual(digesta, algb.digest())) { System.out.println("信息检查正常"); } else { System.out.println("摘要不相同"); }

    } catch (java.security.NoSuchAlgorithmException ex) { System.out.println("非法摘要算法"); }

    }

    public String byte2hex(byte[] b) // 二行制转字符串 { String hs = ""; String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) hs = hs + "0" + stmp; else hs = hs + stmp; }

    return hs.toUpperCase(); }

    }

    b[n] & 0XFF 的作用是将byte转化为int

    因为0xff是整型, byte[] b; b[index] & 0xff 向大的数据类型靠拢,就是整型了。

    java中的byte sign ,所以 将一个负byte强制转换成int,就会损坏原来的binary表示,例如: byte bb=(byte) 0xf1; //11110001 printBinary((int)bb);//11111111111111111111111111110001

    printBinary(bb & 0xff);//00000000000000000000000011110001

  • 相关阅读:
    RHEL5.8配置开机自动挂载磁盘
    RHEL5.8配置NFS服务
    Linux环境下Oracle数据库启动停止命令
    使用的组件:Layui
    使用的组件:Jcrop
    使用的组件:ckeditor
    使用的组件:Web Uploader
    WebSphere试用过期问题处理
    webpack学习笔记(一)
    如何用node命令和webpack命令传递参数 转载
  • 原文地址:https://www.cnblogs.com/lyz459/p/3064944.html
Copyright © 2020-2023  润新知