Java常用加密算法详解与实战代码 - 附可直接运行的测试示例

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用
🍎 《前端技术》专栏以实战为主介绍日常开发中前端应用的一些功能以及技巧,均附有完整的代码示例
✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
👍《Spring Security》专栏中我们将逐步深入Spring Security的各个技术细节,带你从入门到精通,全面掌握这一安全技术
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Java常用加密算法详解与实战代码 - 可直接运行的测试示例

  • 1. 前言
  • 2. 加密算法基础分类
      • 2.1 哈希算法
      • 2.2 对称加密算法
      • 2.3 非对称加密算法
      • 2.4 消息认证码(MAC)
  • 3. 哈希算法
      • 3.1 原理与特点
      • 3.2 Java 示例
  • 4. 对称加密算法
      • 2.1 AES(Advanced Encryption Standard)
      • 2.2 AES 示例
  • 5. 非对称加密算法
      • 5.1 RSA算法
      • 5.2 ECC(椭圆曲线加密)
  • 6. 消息认证码(HMAC)
  • 7. 总结

1. 前言

在信息安全领域,加密算法是保护数据机密性、完整性和身份认证的核心手段。Java 标准库及第三方框架(如 BouncyCastle)提供了丰富的加解密实现,
这里博主将结合 Java 代码,详细介绍常用的几类加密算法,并给出可直接运行的测试示例,帮助小伙伴们快速上手。


2. 加密算法基础分类

2.1 哈希算法

  • 特点:单向不可逆,固定长度输出
  • 用途:数据完整性验证、密码存储
  • 代表算法:MD5、SHA-1、SHA-256、SHA-512

2.2 对称加密算法

  • 特点:加密解密使用相同密钥
  • 优势:速度快,适合大数据量加密
  • 代表算法AES、DES、3DES、RC4

2.3 非对称加密算法

  • 特点:公钥加密,私钥解密
  • 优势:安全性高,解决密钥分发问题
  • 代表算法RSA、ECC、DSA

2.4 消息认证码(MAC)

  • 特点:带密钥的哈希函数
  • 用途:验证消息完整性和来源
  • 代表算法HMAC

3. 哈希算法

3.1 原理与特点

Hash(摘要):将任意长度的数据“压缩”成定长的输出,常用于数据完整性校验。
不可逆:无法从摘要反向推算原文;对抗碰撞攻击(不同输入产生相同输出)是设计目标之一。

在这里插入图片描述

3.2 Java 示例

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class HashUtils {public static String hash(String input, String algorithm) {try {MessageDigest md = MessageDigest.getInstance(algorithm);byte[] digest = md.digest(input.getBytes());// 转为十六进制StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b & 0xff));}return sb.toString();} catch (NoSuchAlgorithmException e) {throw new RuntimeException("Unknown algorithm: " + algorithm, e);}}// 测试主函数public static void main(String[] args) {String text = "HelloWorld";System.out.println("MD5:    " + hash(text, "MD5"));System.out.println("SHA-1:  " + hash(text, "SHA-1"));System.out.println("SHA-256:" + hash(text, "SHA-256"));}
}

运行后,你将看到三种摘要值,验证不同算法的输出长度和差异。


4. 对称加密算法

对称加密使用同一个密钥进行加解密,速度快,适合大数据量场景。

由于 DES 已较为过时,不推荐在新项目中使用,这里就不做DES介绍了,下面主要讲解一下AES

在这里插入图片描述

2.1 AES(Advanced Encryption Standard)

密钥长度:128/192/256 位
模式:ECB(电子密码本)、CBC(密码分组链接)等;CBC 更安全但需 IV

2.2 AES 示例

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;public class AESUtils {// 生成 AES 密钥public static SecretKey genKey(int keySize) throws Exception {KeyGenerator kg = KeyGenerator.getInstance("AES");kg.init(keySize);return kg.generateKey();}// 加密public static String encrypt(String plaintext, SecretKey key, IvParameterSpec iv) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key, iv);byte[] encrypted = cipher.doFinal(plaintext.getBytes());return Base64.getEncoder().encodeToString(encrypted);}// 解密public static String decrypt(String ciphertext, SecretKey key, IvParameterSpec iv) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, key, iv);byte[] decoded = Base64.getDecoder().decode(ciphertext);byte[] decrypted = cipher.doFinal(decoded);return new String(decrypted);}public static void main(String[] args) throws Exception {String text = "SecretMessage";SecretKey key = genKey(128);// 随机 IV,也可使用固定 IV(不推荐)byte[] ivBytes = new byte[16];System.arraycopy("RandomInitVector".getBytes(), 0, ivBytes, 0, 16);IvParameterSpec iv = new IvParameterSpec(ivBytes);String cipherText = encrypt(text, key, iv);String plainText = decrypt(cipherText, key, iv);System.out.println("原文: " + text);System.out.println("加密: " + cipherText);System.out.println("解密: " + plainText);}
}

5. 非对称加密算法

5.1 RSA算法

在这里插入图片描述

算法特点:

基于大数分解难题
密钥长度:1024-4096位
用途:数字签名、密钥交换

import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;public class RSAExample {public static void main(String[] args) throws Exception {String plainText = "Java非对称加密算法";// 生成密钥对KeyPair keyPair = generateRSAKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 公钥加密byte[] cipherText = encryptRSA(plainText, publicKey);System.out.println("RSA加密结果: " + Base64.getEncoder().encodeToString(cipherText));// 私钥解密String decryptedText = decryptRSA(cipherText, privateKey);System.out.println("RSA解密结果: " + decryptedText);// 数字签名示例byte[] signature = signData(plainText, privateKey);boolean isValid = verifySignature(plainText, signature, publicKey);System.out.println("签名验证结果: " + isValid);}public static KeyPair generateRSAKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048); // 密钥长度return keyPairGenerator.generateKeyPair();}public static byte[] encryptRSA(String plainText, PublicKey publicKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));}public static String decryptRSA(byte[] cipherText, PrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedBytes = cipher.doFinal(cipherText);return new String(decryptedBytes, StandardCharsets.UTF_8);}public static byte[] signData(String data, PrivateKey privateKey) throws Exception {Signature signature = Signature.getInstance("SHA256withRSA");signature.initSign(privateKey);signature.update(data.getBytes(StandardCharsets.UTF_8));return signature.sign();}public static boolean verifySignature(String data, byte[] signatureBytes, PublicKey publicKey) throws Exception {Signature signature = Signature.getInstance("SHA256withRSA");signature.initVerify(publicKey);signature.update(data.getBytes(StandardCharsets.UTF_8));return signature.verify(signatureBytes);}
}

5.2 ECC(椭圆曲线加密)

在这里插入图片描述

算法特点:

同等安全强度下密钥更短
计算效率高
适合移动设备

import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;public class ECCExample {public static void main(String[] args) throws Exception {String plainText = "Java椭圆曲线加密";// 生成密钥对KeyPair keyPair = generateECCKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 密钥序列化/反序列化演示String pubKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());String priKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());// 从字符串恢复密钥PublicKey restoredPubKey = restoreECCPublicKey(pubKeyStr);PrivateKey restoredPriKey = restoreECCPrivateKey(priKeyStr);// 数字签名byte[] signature = signDataECC(plainText, restoredPriKey);boolean isValid = verifySignatureECC(plainText, signature, restoredPubKey);System.out.println("ECC签名验证结果: " + isValid);}public static KeyPair generateECCKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");keyPairGenerator.initialize(256); // 密钥长度return keyPairGenerator.generateKeyPair();}public static PublicKey restoreECCPublicKey(String keyStr) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(keyStr);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("EC");return keyFactory.generatePublic(keySpec);}public static PrivateKey restoreECCPrivateKey(String keyStr) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(keyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance("EC");return keyFactory.generatePrivate(keySpec);}public static byte[] signDataECC(String data, PrivateKey privateKey) throws Exception {Signature signature = Signature.getInstance("SHA256withECDSA");signature.initSign(privateKey);signature.update(data.getBytes(StandardCharsets.UTF_8));return signature.sign();}public static boolean verifySignatureECC(String data, byte[] signatureBytes, PublicKey publicKey) throws Exception {Signature signature = Signature.getInstance("SHA256withECDSA");signature.initVerify(publicKey);signature.update(data.getBytes(StandardCharsets.UTF_8));return signature.verify(signatureBytes);}
}

6. 消息认证码(HMAC)

HMAC 用于验证数据完整性及认证,结合了 Hash 与密钥。

算法特点:

输入:密钥 + 消息 → 通过 Hash 计算,输出固定长度摘要。
常见算法:HmacMD5、HmacSHA1、HmacSHA256

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;public class HMACExample {public static void main(String[] args) throws Exception {String message = "重要业务数据";String secretKey = "MySecretKey123";// 计算HMACString hmac = calculateHMAC(message, secretKey);System.out.println("HMAC-SHA256: " + hmac);// 验证消息完整性String receivedMessage = "重要业务数据";String receivedHmac = calculateHMAC(receivedMessage, secretKey);System.out.println("HMAC验证结果: " + hmac.equals(receivedHmac));}public static String calculateHMAC(String data, String key) throws NoSuchAlgorithmException, InvalidKeyException {Mac sha256Hmac = Mac.getInstance("HmacSHA256");SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");sha256Hmac.init(secretKey);byte[] hmacBytes = sha256Hmac.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(hmacBytes);}
}

7. 总结

本文博主介绍了四大类经典加密算法在 Java 中的实现方式:

  • 哈希算法:MD5、SHA-1、SHA-256,用于数据完整性校验;
  • 对称加密:AES、DES,适合大数据量加密;
  • 非对称加密:RSA,实现密钥交换和数字签名;
  • 消息认证码:HMAC,用于完整性与认证。

在生产环境中,建议优先选用 AES(至少 128 位)、SHA-256RSA 2048 位以上,并严格管理密钥和 IV,以确保安全性。希望本文能帮助小伙伴快速掌握 Java 加密实战!
如果你在实践过程中有任何疑问或更好的扩展思路,欢迎在评论区留言,最后希望大家 一键三连 给博主一点点鼓励!


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90233.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025开发者工具链革命:AI赋能的效率跃迁

目录引言:效率焦虑下的开发者生存现状一、智能代码编辑器:从辅助到主导的进化1.1 GitHub Copilot:全能型AI助手1.2 Cursor Pro:极致编码体验1.3 飞算JavaAI:垂直领域颠覆者二、版本控制革命:Git的AI进化论2…

“虚空”的物理、哲学悖论

一、虚空并非“完全真空”:量子场论揭示的“真空不空” 物理真空的本质 现代物理学中的“真空”并非绝对的空无一物,而是量子场的基态(能量最低状态)。根据量子场论: 虚粒子涨落:真空中持续发生量子涨落&am…

CSP-S模拟赛二总结(实际难度大于CSP-S)

T1 很简短,也很好做,第一题直接场切。 我的方法 首先要明确一件事:就是如果选了 ax,ya_{x,y}ax,y​,那么就必然要选 ay,xa_{y,x}ay,x​,所以第一步就在 ax,ya_{x,y}ax,y​ 的基础上加上 ay,xa_{y,x}ay,x​。 然后我…

旋转屏幕优化

1.问题背景 从google原生算法,可以知道其有2个比较大的缺陷: 1) 通过重力传感器传来的x,y,z轴的加速度合成之后只有一个垂直往下的加速度,如果此时用户在别的方向上有加速度,那么通过反余弦、反正切等计算…

Java---day2

七、IDEA开发工具 📦 一、下载 IntelliJ IDEA 官网地址: 🔗 IntelliJ IDEA – the IDE for Pro Java and Kotlin Development 版本选择: 版本说明Community Edition (CE)免费开源版本,适合 Java、Kotlin、Android…

RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架

作者: Shaoting Zhu, Linzhan Mou, Derun Li, Baijun Ye, Runhan Huang, Hang Zhao单位:清华大学交叉信息研究院,上海期智研究院,Galaxea AI,上海交通大学电子信息与电气工程学院论文标题:VR-Robo: A Real-…

碰一碰发视频 + 矩阵系统聚合平台源码搭建,支持OEM

随着短视频生态与多平台运营需求的融合,“碰一碰发视频 矩阵系统” 聚合平台成为内容创作者与企业营销的新基建。这类系统需实现近场交互触发、多平台内容分发、数据聚合分析的全流程闭环,其源码搭建与定制开发需突破硬件交互与软件矩阵的技术壁垒。核心…

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

1. 缓存雪崩(Cache Avalanche)定义:缓存雪崩是指大量缓存中的数据在同一时间过期,导致大量请求同时访问数据库,造成数据库压力骤增,甚至可能导致数据库崩溃。原因:多个缓存的 key 在同一时间过期…

【unity实战】Unity手搓脚本工具实现合并网格功能

注意:考虑到实战的内容比较多,我将该内容分开,并全部整合放在【unity实战】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言实战1、简单的合并网格实现2、设置统一的材质3、设置不同的多种材质4、多材质网格合并方案专栏推荐完结前言 有许多单独的网格对象会影…

ThreadPoolTaskExecutor 的使用案例

ThreadPoolTaskExecutor 的使用案例 1. 依赖说明 <!-- Spring Retry&#xff08;用于任务重试&#xff09; --> <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.1<…

0.3mg硝酸甘油舌下片:冠心病预防中的“消防员”

冠状动脉疾病&#xff08;CAD&#xff09;如同一颗定时炸弹&#xff0c;即使在成功进行血运重建或药物治疗后&#xff0c;心绞痛急性发作的风险依然如影随形。在冠心病管理的漫长战役中&#xff0c;二级预防的核心目标不仅仅是延缓疾病进展&#xff0c;更是预防致命性心脏事件复…

【Spring源码学习系列】基础架构和环境搭建

一直以来都把精力花在中间件的研究和系统设计上&#xff0c;忽略了离我最近的spring&#xff0c;最近开始学习spring的源码了&#xff0c;为了学习到成体系的spring知识和提高学习效率&#xff0c;想要找了一本书看&#xff0c;最终选的是郝佳的《Spring源码深度解析&#xff0…

C++十大排序详解(包括变种优化)

排序**基础排序算法**1. **冒泡排序&#xff08;Bubble Sort&#xff09;**冒泡排序优化**1. 提前终止优化&#xff08;标志位优化&#xff09;****原理**&#xff1a;**实现示例**&#xff08;以C为例&#xff09;&#xff1a;**优点**&#xff1a;**2. 双向冒泡排序&#xff…

React 性能优化实战:用useTransition解决卡顿问题

文章目录1. 概述2. 基本原理与语法3. 应用场景3.1 数据密集型界面的更新优化3.2 动态内容切换的平滑过渡3.3 搜索与过滤结果的实时展示4. 与其他相关Hook的对比5. 结合Suspense使用6. 注意事项1. 概述 useTransition Hook 。它允许开发者将一些非紧急的 UI 更新标记为 “过渡更…

基于Rust红岩题材游戏、汽车控制系统、机器人运动学游戏实例

根据红岩题材设计的关键游戏实例 以下是根据红岩题材设计的关键游戏实例,结合Rust语言特性(如安全并发、ECS架构等)的框架性方案。所有设计均需符合Rust语法规范,实际开发需配合游戏引擎(如Bevy、Amethyst)。 核心系统模块 // ECS架构示例(Bevy引擎) use bevy::prel…

【ZYNQ Linux开发】BRAM的几种驱动方式

1 Vivado配置 ​ BRAM 的使用方法为使用 AXI BRAM 控制器来控制 BRAM 生成器&#xff0c;Block Design 连接如下&#xff1a; 我这里配置的是真双端口 RAM&#xff0c;通过 PL 的逻辑对 BRAM 生成器的端口 B 进行写操作&#xff0c;在 PS 端对端口 A 进行读。 BRAM 控制…

Flink ClickHouse 连接器数据写入源码深度解析

一、引言 在大数据处理的实际应用场景中&#xff0c;数据的高效存储与处理至关重要。Flink 作为一款强大的流式计算框架&#xff0c;能够对海量数据进行实时处理&#xff1b;而 ClickHouse 作为高性能的列式数据库&#xff0c;擅长处理大规模数据分析任务。Flink ClickHouse 连…

OpenCV 人脸分析------面部关键点检测类cv::face::FacemarkLBF

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用 Local Binary Features (LBF) 算法进行面部关键点检测&#xff08;facial landmark detection&#xff09;。该算法通过级联回归树预测人脸的…

Netstat高级分析工具:Windows与Linux双系统兼容的精准筛查利器

Netstat高级分析工具&#xff1a;Windows与Linux双系统兼容的精准筛查利器在网络安全运维中&#xff0c;快速识别可疑连接是防御入侵的关键一步。本文将介绍一款我本人开发的原创高效的双系统兼容Netstat信息分析工具&#xff0c;大幅提升恶意连接筛查效率。一、Netstat分析在安…

Bright Data MCP+Trae :快速构建电商导购助手垂直智能体

声明&#xff1a;本测试报告系作者基于个人兴趣及使用场景开展的非专业测评&#xff0c;测试过程中所涉及的方法、数据及结论均为个人观点&#xff0c;不代表任何官方立场或行业标准。 文章目录 一、引言1.1 当前AI智能体的趋势1.2 构建智能体面临的最大挑战&#xff1a;数据来…