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

Java 常見加密演算法實作:MD5、SHA、RSA 完整範例

     編輯:Java 相關知識

對稱 vs 非對稱加密

  • MD5、SHA:單向雜湊 (Hash),不可逆,適用密碼驗證、資料完整性校驗
  • RSA:非對稱加密,可加密可解密,適用機密資料傳輸、數位簽章

1. MD5 雜湊

protected byte[] encryptMD5(byte[] input) {
    try {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(input);
        return md5.digest(); // 16 bytes (128 bits)
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("MD5 not supported", e);
    }
}

常見用法:儲存密碼雜湊驗證 (建議加鹽 Salt)、檔案校驗和。

2. SHA 雜湊

protected byte[] encryptSHA(byte[] input) {
    try {
        MessageDigest sha = MessageDigest.getInstance("SHA"); // SHA-1, 160 bits
        sha.update(input);
        return sha.digest();
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException("SHA not supported", e);
    }
}

SHA 系列含 SHA-1、SHA-256、SHA-384、SHA-512,安全性遞增。新專案建議用 SHA-256 以上。

3. RSA 非對稱加密/解密

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

public class RSAEncrypt {

    public static void main(String[] args) throws Exception {
        RSAEncrypt rsa = new RSAEncrypt();
        String plainText = "encryptText";

        // 1. 生成金鑰對 (1024 bits 以上,建議 2048)
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048);
        KeyPair kp = kpg.generateKeyPair();
        RSAPrivateKey privateKey = (RSAPrivateKey) kp.getPrivate();
        RSAPublicKey publicKey = (RSAPublicKey) kp.getPublic();

        // 2. 公鑰加密
        byte[] encrypted = rsa.encrypt(publicKey, plainText.getBytes("UTF-8"));
        System.out.println("Encrypted (Base64): " + Base64.getEncoder().encodeToString(encrypted));

        // 3. 私鑰解密
        byte[] decrypted = rsa.decrypt(privateKey, encrypted);
        System.out.println("Decrypted: " + new String(decrypted, "UTF-8"));
    }

    /** 公鑰加密 */
    protected byte[] encrypt(RSAPublicKey publicKey, byte[] data) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            return cipher.doFinal(data);
        } catch (Exception e) {
            throw new RuntimeException("RSA encrypt failed", e);
        }
    }

    /** 私鑰解密 */
    protected byte[] decrypt(RSAPrivateKey privateKey, byte[] data) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return cipher.doFinal(data);
        } catch (Exception e) {
            throw new RuntimeException("RSA decrypt failed", e);
        }
    }
}

關鍵補充說明

  • 填充模式:範例使用 RSA/ECB/PKCS1Padding,明確指定避免預設差異。
  • 資料長度限制:RSA 直接加密資料長度 < 金鑰長度/8 - 11 bytes (PKCS1)。大量資料應採用混合加密:AES 加密資料,RSA 加密 AES 金鑰。
  • 金鑰儲存:實務上金鑰對應儲存於 KeyStore (JKS/PKCS12) 或 HSM,不應硬編碼。
  • 字串編碼:加密輸出為位元組陣列,傳輸/儲存時建議 Base64 或 Hex 編碼。
  • 安全性提醒:MD5/SHA-1 已不建議用於安全敏感場景 (碰撞攻擊),密碼儲存請用 BCrypt、PBKDF2、Argon2 等慢速雜湊。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved