栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现消息摘要算法加密

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现消息摘要算法加密

        在介绍消息摘要算法之前我们先看平时使用的maven下载页面的信息,如下所示:

        上图中提示用户在自己构建maven的时候,为了防止下载文件被损坏,建议用户使用Apache提供的公共KEYS验证发布包的签名。

  • 消息摘要算法

        MD(Message Digest)

        SHA(Secure Hash Algorithm)

        MAC(Message Authentication Code)

        消息摘要算法主要是为了验证数据的完整性,是数字签名的核心算法。由此可见maven的摘要算法采用的是SHA512。

  • 消息摘要算法--MD

        MD家族算法是128位摘要信息,分为MD2、MD4、MD5,MD类算法是一个单向的过程。如下表格所示各类算法实现方:

算法摘要长度实现方
MD2128JDK
MD4128Bouncy Castle
MD5128JDK

MD类算法应用实现

        MD5实现:

package com.bity.md;

import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD4Digest;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import static java.lang.System.*;


public class MdSecurity {
    
    private static final String SRC = "I'm MD Family";
    
    public static void main(String[] args) {
        md5Jdk();
        md2Jdk();
        bcMd4();
    }
    
    
    private static void md5Jdk() {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            
            byte[] md5Bytes = messageDigest.digest(SRC.getBytes(StandardCharsets.UTF_8));
            
            out.println("message digest is : " + Hex.encodeHexString(md5Bytes));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

        MD2实现:

    private static void md2Jdk() {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD2");
            
            byte[] md2Bytes = messageDigest.digest(SRC.getBytes(StandardCharsets.UTF_8));
            
            out.println("message digest is : " + Hex.encodeHexString(md2Bytes));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

        MD4实现:


    private static void bcMd4() {
        Digest digest = new MD4Digest();
        digest.update(SRC.getBytes(StandardCharsets.UTF_8), 0, SRC.getBytes().length);
        
        byte[] md4Bytes = new byte[digest.getDigestSize()];
        
        digest.doFinal(md4Bytes, 0);
    
        out.println("bc md4 digest is : " + org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes));
    }

        通过上面例子可以看出,JDK对于摘要算法的实现是通过MessageDigest 来处理的,对于第三方包提供的MD4算法,我们可以使用JDK提供的方式来处理,如下:


    private static void bcProviderMd4() {
        
        try {
            Security.addProvider(new BouncyCastleProvider());
            MessageDigest messageDigest = MessageDigest.getInstance("MD4");
            
            byte[] md4Bytes = messageDigest.digest(SRC.getBytes(StandardCharsets.UTF_8));
    
            out.println("bc md4 digest is : " + org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

        这里注意使用到了Security.addProvider(new BouncyCastleProvider());,我们在平时开发中建议多使用这种编程思想,让我们的代码有更好的扩展性。

  • 消息摘要算法--SHA

        SHA是安全散列算法,是固定长度的摘要信息,SHA的发展是在MD系列之后,在很多场景下被认为是MD算法的继承者,SHA有着比较好的美国官方背景,是美国的国家安全局设计,被美国的国家标准研究院发布的一系列散列码函数(SHA-1,SHA-2(SHA-224、SHA-256、SHA-384、SHA-512))。SHA这种散列码是在MD4的基础上演进而来的,所以它也有着固定长度的摘要信息。如下表格所示各类算法实现方:

算法摘要长度实现方
SHA-1160JDK
SHA-224224Bouncy Castle
SHA-256256JDK
SHA-384384JDK
SHA-512512JDK

SHA类算法应用实现

    SHA-1实现:

package com.bity.sha;

import org.apache.commons.codec.binary.Hex;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import static java.lang.System.*;


public class ShaSecurity {
    
    private static String src = "I'm WINQI";
    
    public static void main(String[] args) {
        jdkSha1();
    }
    
    
    private static void jdkSha1() {
        
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA");
            messageDigest.update(src.getBytes(StandardCharsets.UTF_8));
            out.println("jdk sha-1 is : " + Hex.encodeHexString(messageDigest.digest()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        
    }
}

        对于其他几类算法的实现,在创建消息摘要对象的时候通过MessageDigest.getInstance("SHA")指定对应的算法即可。

  • 消息摘要算法--MAC

        通常我们把MAC称为HMAC(Keyed-Hash Message Authentication code)含有密钥散列函数算法。融合了MD、SHA。

        HMAC-MD系列有:HmacMD2、HmacMD4、HmacMD5。

        HMAC-SHA系列有:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512。

        这类算法我们常见的应用比如SecureCRT等。如下表格所示各类算法实现方:

算法摘要长度实现方
HmacMD2128Bouncy Castle
HmacMD4128Bouncy Castle
HmacMD5128JDK
HmacSHA1160JDK
HmacSHA224224Bouncy Castle
HmacSHA256256JDK
HmacSHA384384JDK
HmacSHA512512JDK

         HmacMD5实现:

package com.bity.hmac;

import org.apache.commons.codec.binary.Hex;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import static java.lang.System.*;


public class Hmac {
    
    private static final String SRC = "I'm HMAC Family";
    
    public static void main(String[] args) {
        jdkHmacMd5();
    }
    
    
    private static void jdkHmacMd5() {
        
        try {
            // 初始化 KeyGenerator
            KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
            // 产生秘钥
            SecretKey secretKey = keyGenerator.generateKey();
            // 获得秘钥
            byte[] keys = secretKey.getEncoded();
            
            // 还原秘钥
            SecretKey restoreKey = new SecretKeySpec(keys, "HmacMD5");
            // 实例化MAC
            Mac mac = Mac.getInstance(restoreKey.getAlgorithm());
            // 初始化Mac
            mac.init(restoreKey);
            
            //执行摘要
            byte[] hmacMd5Bytes = mac.doFinal(SRC.getBytes(StandardCharsets.UTF_8));
            
            out.println("hmac md5 digest is : " + Hex.encodeHexString(hmacMDdBytes));
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            e.printStackTrace();
        }
    }
}

        对于其他几种算法的实现和上面雷同,这里不做更多的编码实现。MAC消息摘要算法的消息传递时序如下所示:

        以上内容就是Java中对于消息摘要算法的原理介绍及代码实现。

附加

        关于加解密相关系列文章会在微信公众号《编程之艺术》中每天连载分享,感兴趣的朋友可以关注下,可以及时获取最新文章连载信息。

                                                  

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/852146.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号