首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 密碼學實戰:消息摘要、對稱/非對稱加密、數位簽名與證書

     編輯:Java 相關知識

本文以 JDK 1.5 為基礎,通過完整代碼示例演示 Java 加密體系的四大支柱:消息摘要(完整性)、對稱加密(機密性)、非對稱加密(密鑰交換/簽名)、數位簽名(身份驗證/防抵賴)與數位證書(信任鏈)。

1. 消息摘要

單向雜湊函數,常用於密碼存儲、檔案完整性校驗。JDK 提供 MessageDigest 支援 MD5、SHA-1、SHA-256 等演算法。

MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(plainTextBytes);
byte[] digest = md.digest();

2. 對稱加密(私鑰加密)

加解密使用同一把密鑰,速度快,適合大量資料。典型演算法:AES(128/192/256 位)、DESede。JDK 透過 KeyGenerator 產生密鑰,Cipher 執行加解密。

KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128);
Key key = kg.generateKey();
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText = cipher.doFinal(plainText);

3. 非對稱加密(公鑰加密)

密鑰對:公鑰加密 → 私鑰解密(機密性);私鑰加密 → 公鑰解密(簽名)。典型演算法:RSA(JDK 1.5+ 內建支援)。速度較慢,通常僅加密對稱密鑰或摘要。

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());

4. 數位簽名

流程:資料 → 摘要(SHA-1) → 私鑰加密摘要 → 簽名。驗證:公鑰解密簽名得摘要 → 對比重新計算摘要。JDK 使用 Signature 類實現。

Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(privateKey);
sig.update(data);
byte[] signature = sig.sign();
// 驗證
sig.initVerify(publicKey);
sig.update(data);
boolean ok = sig.verify(signature);

5. 數位證書與 Keytool

解決「公鑰真偽」問題:CA 機構對「身份+公鑰」簽名形成證書。JDK 提供 keytool 管理金鑰庫:

# 產生自簽名證書
keytool -genkey -alias mykey -keyalg RSA -keystore mystore
# 簽名 JAR
jarsigner -keystore mystore app.jar mykey

工程建議

  • 生產環境務必使用受信 CA 簽發的證書,而非自簽名。
  • 對稱加密優先選 AES-GCM(認證加密),避免 ECB 模式。
  • RSA 金鑰長度建議 ≥ 2048 位;長期機密性考慮 3072/4096 位。
  • 密碼儲存請使用 bcrypt、PBKDF2 或 Argon2 等慢雜湊,而非單純 SHA/MD5。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved