当前位置:首页 > Java技术 > java基础---->摘要算法的介绍

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

2022年09月16日 15:12:25Java技术2

  数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(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

 由于md5的算法被发现了某些微妙的规律性。所以建议最好使用ShA1的算法。

 

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

 

友情链接

 

作者:huhx
来源链接:https://www.cnblogs.com/huhx/p/messageDigest.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/41972.html

分享给朋友:

“java基础---->摘要算法的介绍” 的相关文章

yum安装步骤(网络下载安装)

yum安装步骤(网络下载安装)

yum是Linux系统的安装必备神器,简直不要太方便。但是新系统一般是不自带yum工具的,所以需要手动安装一下。环境:centos7新建一个目录用来保存yum安装包 mkdir install  进入文件夹并输入命令wget http://yum.bas...

记一次SpringBoot项目使用RedisTemplate无法反序列化字节数组问题困扰8小时巨坑

记一次SpringBoot项目使用RedisTemplate无法反序列化字节数组问题困扰8小时巨坑

一、问题描述 问题描述: 前提:向Redis中SET值的是一个JFinal项目,使用的Jedis客户端API操作的,把一个对象转成byte[]形式存入Redis中。 然后在另一个SpringBoot项目中我通过Spring自带的RedisTempl...

如何读取服务器中文本文件并转为文字

如何读取服务器中文本文件并转为文字 ​ 开发代码的过程中,当数据内容过长或者过大时,考虑性能,一般会选择将数据上传到文件服务器,而并非存到数据库中,当需要对数据进行解析处理时,需要把文件从服务器中读取下来并解析为想要的数据,这里将解析为字符串的方法进行示例...

linux系统(CentOS7)下安装tomcat8及加载缓慢处理

linux系统(CentOS7)下安装tomcat8及加载缓慢处理

一、下载tomcat 地址奉上 二、linux下安装 1.使用SecureCRT终端连接服务器 2.使用sftp Session上传tomcat压缩包到服务器上 3.使用tar -zxvf 命令解压tomcat 4.进入bin目录启动tomcat(./sta...

ActiveMQ安装部署(win版和linux版)

ActiveMQ安装部署(win版和linux版)

一、前言 之前整理过消息队列工具之一的kafka,Kakfa一开始被设计就是以高吞吐+高性能+HA来实现的。压测显示Kafka的吞吐量大概高于active mq两个数量级。即使Kafka配置了全同步的复制,也会比Active MQ高5~6倍,但是Active MQ作为传统的消息队列工具,也是...

SpringBoot+Mybatis框架整合Shiro权限管理

SpringBoot+Mybatis框架整合Shiro权限管理

一、前言 ​ 之前曾分享过一个关于shiro的认证原理的文章,分享了一下shiro的认证流程与shiro中的名词解释,其实shiro作为一款轻量级框架,被应用在各种中小型及大型企业的登录认证和用户授权的模块,有小伙伴称,在用SpringBoot框架,之前用过xml方式进行配置shiro框架,...

常用设计模式系列(二)—工厂方法模式

常用设计模式系列(二)—工厂方法模式

一、前言 hello各位小伙伴好,天气贼冷,多冻手,但是还是不能降低我编写设计模式讲解的热情。设计模式的魅力就像那冬天里的一把火,怎么也浇不灭; 上期讲解了简单工厂模式的应用场景及优缺点分析,今天开始我们的设计模式第二弹——工厂方法模式,其实工厂方法模式类似于简单工厂模式的一个升级...

常用设计模式系列(五)—原型模式

常用设计模式系列(五)—原型模式

一、前言 各位朋友大家好,经过几天的努力,我已经讲解了常用设计模式其中的四种,分别是简单工厂、工厂方法、抽象工厂、建造者模式,正在想着下一遍写哪个模式的时候,有个朋友先说他想先看看原型模式,说想看看原型模式是如何运行的,然后我给这个朋友讲了个故事:“从前有个老铁得了个病,听说还挺严重的,后来...

java基础知识讲解(一)数据类型和运算符

java基础知识讲解(一)数据类型和运算符

Java是一种强类型语言,每个变量都必须声明其数据类型。 Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。 Java中定义了3类8种基本数据类型 数值型- b...

AIX系统下挂载外置存储

AIX系统下挂载外置存储

连接盘柜后在盘柜里映射好分区。  1.扫描硬件才能发现盘柜映射的容量 ,命令cfgmgr2、查看在 AIX 系统下能否认到盘柜的分区。 命令:lsdev -Cc disk3、查看物理卷(pv),命令:lspv 4、先激活 PVID ,命令chdev -l hdisk2 -a pv=yes5...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。