热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javamd5加密解密_Java加密与解密之消息摘要算法2

上一篇介绍了MD及SHA,接下来我们来说说MAC算法。MAC只要就是加入了密钥。上一篇:Java加密与解密之消息摘要算法MAC:Messa

上一篇介绍了MD及SHA,接下来我们来说说MAC算法。MAC只要就是加入了密钥。

上一篇:Java加密与解密之消息摘要算法

MAC:Message Authentication Code,消息认证码算法。

MAC算法结合了MD5和SHA算法的优势,加入了密钥的支持,是一种更加安全的消息摘要算法。

MAC兼容了MD和SHA算法的特性,并在此基础上加入了密钥, 因为MAC算法融合了密钥散列函数通常我们也把MAC称为HMAC(keyd-Hash Message Authentication Code)。

MD系列:HmacMD2,HmacMD4,HmacMD5三种算法;

SHA系列:HmacSHA1,HmacSHA224,HmacSHA256,HmacSHA384,HmacSHA512五种算法。

HMAC生成的摘要信息长度与使用的MD或是SHA是对应的。如:HmacSHA256使用这个算法那生成的摘要信息长度就是256个字节。

JDK8支持的算法:

HmacMD5,HmacSHA1,HmacSHA256,HmacSHA384,HmacSHA512


HmacMD2,HmacMD4,HmacSHA224这三种不支持,只用使用第三方库BC(Bouncy Castle)

代码示例:

9f17fea4c020c0a6cd1a0e837e354d70.png

初始化生成密钥

92c9fe26ab65f141e20228036eafa977.png

通过密钥生成摘要数据

bb8d31391c290ef20637be80cb83c9fe.png

测试

package com.pack.security.mac;import java.nio.charset.Charset;import java.util.Base64;import javax.crypto.KeyGenerator;import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class HmacSHA1 {// 算法private static final String ALGORITHM = "HmacSHA1" ;/** *

* 初始化HmacSHA1密钥 *

*2020年10月8日 下午2:55:38 *@author xg *@return byte[] 生成的密钥信息 *@throws Exception */public static byte[] initHmacSHA1Key() throws Exception{// 初始化KeyGenerator密钥生成器KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM) ;// 产生密钥SecretKey secretKey = keyGenerator.generateKey() ;// 获取密钥return secretKey.getEncoded() ;}/** *

* HmacSHA1 消息摘要 *

*&#64;author xg *&#64;param data 要加密的数据 *&#64;param key 密钥信息 * &#64;return byte[] 摘要信息 *&#64;throws Exception */public static byte[] encodeHmacSHA1(byte[] data, byte[] key) throws Exception {// 还原密钥SecretKey secretKey &#61; new SecretKeySpec(key, ALGORITHM) ;// 实例化MACMac mac &#61; Mac.getInstance(secretKey.getAlgorithm()) ;// 初始化macmac.init(secretKey) ;// 返回消息摘要return mac.doFinal(data) ;}public static String hex(byte[] digest) {StringBuilder sb &#61; new StringBuilder() ;for (byte b : digest) {String str &#61; Integer.toHexString(b & 0xff) ;if (str.length() <2) {sb.append("0" &#43; str) ;} else {sb.append(str) ;}}return sb.toString() ;}public static void main(String[] args) throws Exception {String message &#61; "我是HmacSHA1算法" ;byte[] key1 &#61; initHmacSHA1Key() ;String strKey1 &#61; Base64.getEncoder().encodeToString(key1) ;byte[] messageDigest1 &#61; encodeHmacSHA1(message.getBytes(Charset.forName("UTF-8")), key1) ;String strDigest1 &#61; hex(messageDigest1) ;System.out.println(strDigest1) ;byte[] key2 &#61; Base64.getDecoder().decode(strKey1.getBytes()) ;byte[] messageDigest2 &#61; encodeHmacSHA1(message.getBytes(Charset.forName("UTF-8")), key2) ;String strDigest2 &#61; hex(messageDigest2) ;System.out.println(strDigest2) ;System.out.println(strDigest1.equals(strDigest2)) ;}}

笔者曾经在一个项目中使用过该算法。当时是有很多的厂商要和我们系统对接&#xff0c;为了安全我们给每一个厂商提供一个密钥&#xff0c;然后厂商按照我们的约定对所有的入参进行签名&#xff0c;我们系统进行安全验证。

其它的算法这里就不演示了&#xff0c;针对自己使用的JDK版本看是否支持你所需要的算法即可&#xff0c;基本上BC支持了我们熟知的所有加解密算法。

到此我们对消息摘要算法进行了简单的介绍和使用。后续还会对对称加密和非对称加密及数字签名算法进行介绍。



推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
author-avatar
总是被姨妈折磨的吕孩纸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有