java基础---->摘要算法的介绍 (转)

  数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。今天,我们就开始java中摘要算法的学习。

项目结构如下:

SHA算法

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

一、 HuhxSHA.java

package com.huhx.md;

import java.security.MessageDigest;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.junit.Test;

/**
 * wirter: huhx
 */
public class HuhxSHA {
    private static String src = "http://www.cnblogs.com/huhx";

    // jdk版本的sha算法
    @Test
    public void jdkSHA1() {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA");
            messageDigest.update(src.getBytes());
            byte[] shaBytes = messageDigest.digest();
            System.out.println("jdk SHA 1: " + Hex.encodeHexString(shaBytes));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // commons-codec的sha算法
    @Test
    public void bcSHA1() {
        Digest digest = new SHA1Digest();
        digest.update(src.getBytes(), 0, src.length());

        byte[] shaBytes = new byte[digest.getDigestSize()];
        digest.doFinal(shaBytes, 0);
        System.out.println("bc SHA 1: " + org.bouncycastle.util.encoders.Hex.toHexString(shaBytes));
    }

    // bcprov的sha算法
    @Test
    public void ccSHA1() {
        System.out.println("cc SHA 1: " + DigestUtils.sha1Hex(src.getBytes()));
    }
}

二、 运行结果如下:

jdk SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f
bc SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f
cc SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f

MD算法

MD2
  Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验将和MD2产生冲突。MD2算法加密后结果是唯一的(即不同信息加密后的结果不同)。

MD4
  为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。

MD5
  1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

一、 HuhxMD.java

package com.huhx.md;

import java.security.MessageDigest;
import java.security.Security;

import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test;

public class HuhxMD {
    private static String src = "http://www.cnblogs.com/huhx";

    @Test
    public void jdkMD5() {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            byte[] mdBytes = messageDigest.digest(src.getBytes());
            System.out.println("md5 decode: " + Hex.toHexString(mdBytes));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void jdkMD2() {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD2");
            byte[] mdBytes = messageDigest.digest(src.getBytes());
            System.out.println("md2 decode: " + Hex.toHexString(mdBytes));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void bcmMD4() {
        // Digest digest = new MD4Digest();
        // digest.update(src.getBytes(), 0, src.length());
        // byte[] mdBytes = new byte[digest.getDigestSize()];
        // digest.doFinal(mdBytes, 0);
        // System.out.println("md4 decode: " + Hex.toHexString(mdBytes));

        Security.addProvider(new BouncyCastleProvider());
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD4");
            byte[] mdBytes = messageDigest.digest(src.getBytes());
            System.out.println("md4 decode: " + Hex.toHexString(mdBytes));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //
    @Test
    public void bcmMD5() {
        Digest digest = new MD5Digest();
        digest.update(src.getBytes(), 0, src.length());
        byte[] mdBytes = new byte[digest.getDigestSize()];
        digest.doFinal(mdBytes, 0);
        System.out.println("md5 decode: " + Hex.toHexString(mdBytes));
    }

    //
    @Test
    public void ccMD5() {
        String md5String = DigestUtils.md5Hex(src.getBytes());
        System.out.println("common md5: " + md5String);
    }
}

二、 运行结果如下:

md4 decode: b402321e9a067da3df0c36c8315f8e38
md5 decode: f121bf5f7491466ae75e056f686c4462
md2 decode: 42b6b066b1273470f9aad644cede7644
md5 decode: f121bf5f7491466ae75e056f686c4462
common md5: f121bf5f7491466ae75e056f686c4462

MAC算法

MAC算法 (Message Authentication Codes) 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制。此时Hash值称作MAC。

MAC算法原理(以直联银联pos和POS中心通讯为例)。

  • 将欲发送给POS中心的消息中,从消息类型(MTI)到63域之间的部分构成MAC ELEMEMENT BLOCK (MAB)。
  • 对MAB,按每8个字节做异或(不管信息中的字符格式),如果最后不满8个字节,则添加“0X00”。

一、 HuhxMAC.java

package com.huhx.md;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Test;

public class HuhxMAC {

    private static String src = "http://www.cnblogs.com/huhx";
    private static String decodeKey = "bbbbbbbbbb";

    @Test
    public void jdkHmacMD5() {
        try {
            // 初始化KeyGenerator
            KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
            // 产生密钥
            SecretKey secretKey = keyGenerator.generateKey();
            // 获得密钥
            // byte[] keyBytes = secretKey.getEncoded();
            byte[] keyBytes = org.apache.commons.codec.binary.Hex.decodeHex(decodeKey.toCharArray());
            // 还原密钥
            SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacMD5");
            // 实例化MAC
            Mac mac = Mac.getInstance(secretKeySpec.getAlgorithm());
            // 初始化Mac
            mac.init(secretKeySpec);
            // 执行摘要
            byte[] result = mac.doFinal(src.getBytes());
            System.out.println("jdk mac: " + Hex.toHexString(result));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Test
    public void bcHmacMD5() {
        HMac hMac = new HMac(new MD5Digest());
        hMac.init(new KeyParameter(Hex.decode(decodeKey)));
        hMac.update(src.getBytes(), 0, src.length());

        byte[] hMacBytes = new byte[hMac.getMacSize()];
        hMac.doFinal(hMacBytes, 0);
        System.out.println("bc mac: " + Hex.toHexString(hMacBytes));
    }
}

二、 运行结果如下:

bc mac: 3bf59d550b1e0d6cee15e015870029f9
jdk mac: 3bf59d550b1e0d6cee15e015870029f9

http://www.cnblogs.com/huhx/p/messageDigest.html

时间: 2024-09-30 19:37:31

java基础---->摘要算法的介绍 (转)的相关文章

java基础---->摘要算法的介绍

数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(Hash)算法.散列算法.今天,我们就开始java中摘要算法的学习. 项目结构如下: SHA算法 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorit

【java基础】IOC介绍及其简单实现

控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找.依赖注入应用比较广泛,我们这里只介绍依赖注入. 一.IOC简介 控制反转IOC,它最主要反映的是与传统面向对象(OO)编程的不同.通常我们编程实现某种功能都需要几个对象相互作用,从编程的角度出发,也就是一个主对象要保存其他类型对象的引

十、java基础之this介绍

/*一.this关键字: 1.this什么? this是一个引用类型 在堆中的每一个java对象上都有this this保存的内存地址指向自身 2.this能用在哪里? 第一:this可以用在成员方法中 第二:this可以用在构造方法中 this(实参); 通过一个构造方法去调用另一个构造方法 目的:代码复用 注意:this(实参)必须出现在构造方法中第一个语句:否则报:Error:(40, 13) java: 对this的调用必须是构造器中的第一个语句 3.this可以用来区分成员变量和局部变

JAVA 基础 HTTP的介绍

目录 http的方法 http请求头Content-Type编码指定 form表单 httpClient的使用(图片来自于网络) http的方法 OPTIOINS  返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向Web服务器发送"*"请求测试服务器的功能性 HEAD 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回,这一方法可以在不必传输整个响应内容的情况下,就可以获取包含响应消息头中的元信息 GET     向特定的资源发出请求,它本质就是发送一个请求来取得

java基础之----jvm介绍

常见的垃圾收集器 参考这篇文章:https://crowhawk.github.io/2017/08/15/jvm_3/ 如何判断某个对象为垃圾 引用计数法 目前主流的java虚拟机都摒弃掉了这种算法,最主要的原因是它很难解决对象 之间相互循环引用的问题.尽管该算法执行效率很高. 例如:在testGC()方法中,对象objA和objB都有字段instance,赋值令objA.instance=objB及objB.instance=objA,除此之外这两个对象再无任何引用,实际上这两个对象都已经不

-Java基础-Java介绍

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. java的介绍 1.1java简介 Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言. 它最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机.电话.闹钟.烤面包机等家用电器的控制和通讯问题.由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划.就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机

java基础介绍(转)

很全面的介绍JAVA基础的文档 Java 编程简介,第 1 部分: Java 语言基础 http://www.ibm.com/developerworks/cn/java/j-introtojava1/ Java 编程简介,第 2 部分: 构建真实的应用程序 http://www.ibm.com/developerworks/cn/java/j-introtojava2/

Java基础笔记 – Annotation注解的介绍和使用 自定义注解

Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Annotation的工作原理:2.@Override注解:3.@Deprecated注解:4.@SuppressWarnings注解:5.自定义注解:5.1.添加变量:5.2.添加默认值:5.3.多变量使用枚举:5.4.数组变量:6.设置注解的作用范围:6.1.在自定义注解中的使用例子:7.使用反射读取R

【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-import.html#1.2.values方法的使用: Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由arthinking发表于4年前 | Java基础 | 暂无评论 |  被围观 8,332 views+ 1.枚举(Enum):1.1.枚举类型中的两个静态方法:1.2.values方法的使用: