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
英文地址,請注明出處:http://en.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;數據來…