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

Java 加密算法實戰:MD5、SHA 與 RSA 完整應用指南

     編輯:Java 程式設計入門

在資訊安全領域,雜湊算法與非對稱加密是兩大基石。本文透過完整代碼示例,詳細解析 Java 中 MD5、SHA、RSA 三大核心加密算法的實際應用場景與實作細節。

1. MD5 訊息摘要算法

適用場景:密碼儲存驗證、檔案完整性校驗、數位簽名基礎
特點:單向不可逆、定長 128 位輸出、計算速度極快

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Util {
    public static byte[] encrypt(byte[] input) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(input);
            return md5.digest();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5 算法不可用", e);
        }
    }
    
    // 輔助方法:位元組陣列轉十六進制字串
    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}
安全提醒:MD5 已被證實存在碰撞漏洞,不建議用於高安全性場景的密碼儲存。現代應用應改用 BCrypt、SCrypt 或 PBKDF2 等慢速雜湊函數。

2. SHA 安全雜湊算法家族

適用場景:數位憑證、SSL/TLS 協議、區塊鏈、安全性要求較高的完整性校驗
常用變體:SHA-1(160位)、SHA-256(256位)、SHA-512(512位)

public class SHAUtil {
    public static byte[] encrypt(byte[] input, String algorithm) {
        try {
            MessageDigest digest = MessageDigest.getInstance(algorithm);
            digest.update(input);
            return digest.digest();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(algorithm + " 算法不可用", e);
        }
    }
    
    // 使用範例
    public static void main(String[] args) {
        String data = "Hello Security";
        System.out.println("SHA-256: " + bytesToHex(encrypt(data.getBytes(), "SHA-256")));
        System.out.println("SHA-512: " + bytesToHex(encrypt(data.getBytes(), "SHA-512")));
    }
}

3. RSA 非對稱加密算法

核心優勢:公開金鑰加密、私鑰解密,解決金鑰分發難題
適用場景:敏感資料傳輸、數位簽名、HTTPS 協議、電子郵件加密

import java.security.*;
import javax.crypto.Cipher;

public class RSAUtil {
    
    // 生成金鑰對
    public static KeyPair generateKeyPair(int keySize) throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        keyPairGen.initialize(keySize);
        return keyPairGen.generateKeyPair();
    }
    
    // 公鑰加密
    public static byte[] encrypt(PublicKey publicKey, byte[] data) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(data);
    }
    
    // 私鑰解密
    public static byte[] decrypt(PrivateKey privateKey, byte[] encryptedData) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(encryptedData);
    }
    
    // 完整測試流程
    public static void main(String[] args) throws Exception {
        // 1. 生成 2048 位金鑰對(現代建議最小規格)
        KeyPair keyPair = generateKeyPair(2048);
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        
        // 2. 準備明文
        String plainText = "機密資料:RSA 加密測試";
        byte[] data = plainText.getBytes("UTF-8");
        
        // 3. 加密
        byte[] encrypted = encrypt(publicKey, data);
        System.out.println("加密後: " + bytesToHex(encrypted));
        
        // 4. 解密
        byte[] decrypted = decrypt(privateKey, encrypted);
        System.out.println("解密後: " + new String(decrypted, "UTF-8"));
    }
    
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) sb.append(String.format("%02x", b));
        return sb.toString();
    }
}

算法選型決策表

算法類型金鑰管理性能推薦場景
MD5雜湊無極快非安全性校驗、快速指紋
SHA-256雜湊無快區塊鏈、憑證、完整性驗證
RSA-2048非對稱加密雙鑰慢金鑰交換、數位簽名、小資料加密

工程實踐關鍵點

  • 金鑰長度:RSA 建議 ≥ 2048 位,1024 位已被視為不安全
  • 填充模式:實際生產務必指定 RSA/ECB/OAEPWithSHA-256AndMGF1Padding,避免使用預設的 PKCS#1 v1.5
  • 資料長度限制:RSA 可加密資料長度 < keySize/8 - 11 bytes (PKCS#1),大資料應採用混合加密(AES 加密資料 + RSA 加密 AES 金鑰)
  • 隨機數來源:金鑰生成需使用 SecureRandom 而非預設隨機源

掌握這三大算法的特性與適用邊界,是構建安全 Java 應用的基礎能力。實際專案中,建議優先使用成熟的安全框架(如 Spring Security、Bouncy Castle)而非手工拼裝加密邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved