JAVA加密解密之常用签名算法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
MD5算法具有以下特点:
1. 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2. 容易计算:从原数据计算出MD5值很容易。
3. 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4. 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

在下面的示例中,将演示MD5、Hmac等签名算法的使用方式

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.zip.CRC32;

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

/**
 * 加密解密基类
 * 
 * @author jianggujin
 * 
 */
public class BasicCoder
{
   /**
    * MD5(Message Digest algorithm 5,信息摘要算法)
    * 
    * @param data
    *           加密数据
    * @return
    * @throws UnsupportedEncodingException
    * @throws NoSuchAlgorithmException
    */
   public byte[] makeMD5(byte[] data) throws NoSuchAlgorithmException
   {
      MessageDigest mdTemp = MessageDigest.getInstance("MD5");
      mdTemp.update(data);
      return mdTemp.digest();
   }

   /**
    * SHA(Secure Hash Algorithm,安全散列算法)
    * 
    * @param data
    *           加密数据
    * @return
    * @throws NoSuchAlgorithmException
    * @throws Exception
    */
   public byte[] makeSHA(byte[] data) throws NoSuchAlgorithmException
   {
      MessageDigest sha = MessageDigest.getInstance("SHA");
      sha.update(data);
      return sha.digest();
   }

   /**
    * HmacSHA1
    * 
    * @param data
    *           加密数据
    * @param key
    *           密钥
    * @return
    * @see Hmac
    * @throws UnsupportedEncodingException
    * @throws NoSuchAlgorithmException
    * @throws InvalidKeyException
    */
   public byte[] makeHmacSHA1(byte[] data, byte[] key)
         throws NoSuchAlgorithmException, InvalidKeyException
   {
      return makeHmac(Hmac.HmacSHA1, data, key);
   }

   /**
    * HmacMD5
    * 
    * @param data
    *           加密数据
    * @param key
    *           密钥
    * @return
    * @see Hmac
    * @throws UnsupportedEncodingException
    * @throws NoSuchAlgorithmException
    * @throws InvalidKeyException
    */
   public byte[] makeHmacMD5(byte[] data, byte[] key)
         throws NoSuchAlgorithmException, InvalidKeyException
   {
      return makeHmac(Hmac.HmacMD5, data, key);
   }

   /**
    * Hmac
    * 
    * @param hmac
    *           加密类型
    * @param data
    *           加密数据
    * @param key
    *           密钥
    * @return
    * @see Hmac
    * @throws UnsupportedEncodingException
    * @throws NoSuchAlgorithmException
    * @throws InvalidKeyException
    */
   public byte[] makeHmac(Hmac hmac, byte[] data, byte[] key)
         throws NoSuchAlgorithmException, InvalidKeyException
   {
      Mac mac = Mac.getInstance(hmac.toString());
      SecretKeySpec spec = new SecretKeySpec(key, hmac.toString());
      mac.init(spec);
      return mac.doFinal(data);
   }

   /**
    * CRC32,循环冗余校验
    * 
    * @param data
    *           校验数据
    * @return
    */
   public long makeCRC32(byte[] data)
   {
      CRC32 crc32 = new CRC32();
      crc32.update(data);
      return crc32.getValue();
   }

   /**
    * Hmac(Hash Message Authentication Code,散列消息鉴别码)
    * 
    * @author jianggujin
    * 
    */
   public enum Hmac
   {
      HmacMD5, HmacSHA1, HmacSHA256, HmacSHA384, HmacSHA512
   }

   /**
    * 初始化HMAC密钥
    * 
    * @return
    * @see Hmac
    * @throws Exception
    */
   public byte[] initMacKey(Hmac hmac) throws Exception
   {
      KeyGenerator keyGenerator = KeyGenerator.getInstance(hmac.toString());
      SecretKey secretKey = keyGenerator.generateKey();
      return secretKey.getEncoded();
   }

   private static final char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6',
         '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

   /**
    * 将字节流按16进制转换成字符串.
    */
   public static String byte2String(byte[] buf)
   {
      int count = buf.length;
      StringBuffer sbuf = new StringBuffer();
      for (int i = 0; i < count; i++)
      {
         byte byte0 = buf[i];
         sbuf.append(hexDigits[byte0 >>> 4 & 0xf]).append(
               hexDigits[byte0 & 0xf]);
      }
      return sbuf.toString().toUpperCase();
   }
}
目录
相关文章
|
23天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
59 15
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
112 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
15天前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
57 32
|
5天前
|
存储 监控 算法
剖析基于Java算法驱动的智能局域网管控之道
本文探讨了基于Java语言的局域网控制方案,结合链表数据结构与令牌桶算法,解决设备管理和流量调度难题。通过链表灵活存储网络设备信息,实现高效设备管理;令牌桶算法则精准控制流量,确保网络平稳运行。二者相辅相成,为校园、企业等局域网提供稳固高效的控制体系,保障业务连续性和数据安全。
|
3天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
32 6
|
3天前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
27 5
|
13天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
22天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
58 12
|
29天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
37 6
|
3月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
605 2

热门文章

最新文章