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

Java 加密與數位簽名程式設計實戰指南

     編輯:Java 程式設計入門

前言

密碼學是資訊安全的基石,而在 Java 平台上實作加密與數位簽名功能,則是開發者必備的核心技能之一。本文將從基本概念切入,逐步深入至 JDK 1.5 環境下的實際程式碼範例,帶領讀者掌握訊息摘要、對稱式加密與非對稱式加密的關鍵技術。若對密碼學理論有濃厚興趣,強烈推薦研讀 Bruce Schneier 的經典巨著《Applied Cryptography》。

一、核心密碼學概念速覽

1. 訊息摘要:確保資料完整性的指紋

訊息摘要演算法(如 MD5、SHA-1)能將任意長度的輸入資料轉換為固定長度的「數位指紋」。這是單向函數,不可逆向還原原始資料,主要用於驗證資料在傳輸或儲存過程中未被竄改。JDK 1.5 內建支援主流摘要演算法,透過 java.security.MessageDigest 類別即可輕鬆實作。

程式碼範例:SHA-1 訊息摘要

import java.security.MessageDigest;

public class MessageDigestExample {
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            System.err.println("Usage: java MessageDigestExample ");
            System.exit(1);
        }

        byte[] plainText = args[0].getBytes("UTF-8");

        // 取得 SHA-1 演算法實例 (160 位元)
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        System.out.println("Provider: " + md.getProvider().getInfo());

        // 更新摘要並輸出結果
        md.update(plainText);
        System.out.println("Digest: " + new String(md.digest(), "UTF-8"));
    }
}

此外,javax.crypto.Mac (Message Authentication Code) 提供了帶金鑰的摘要機制(HMAC),進一步強化資料完整性與來源驗證,有興趣的讀者可自行查閱 API 文件深入研究。

2. 私鑰加密(對稱式加密):高效的機密性保護

對稱式加密使用相同金鑰進行加密與解密,速度快、適合大量資料處理。常見演算法包含 DES(有效金鑰長度 56 位)、AES(支援 128/192/256 位)、DESede (3DES) 等。JDK 1.5 對這些演算法提供完整支援。核心流程:使用 KeyGenerator 產生金鑰,再透過 Cipher 類別執行加解密操作。

程式碼範例:AES 對稱加密

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;

public class PrivateExample {
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            System.err.println("Usage: java PrivateExample ");
            System.exit(1);
        }
        byte[] plainText = args[0].getBytes("UTF-8");

        // 1. 產生 AES 金鑰
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128); // 可指定 128, 192, 256
        Key secretKey = keyGen.generateKey();

        // 2. 初始化 Cipher 進行加密
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] cipherText = cipher.doFinal(plainText);
        System.out.println("Encrypted: " + new String(cipherText, "UTF-8"));

        // 3. 解密驗證
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedText = cipher.doFinal(cipherText);
        System.out.println("Decrypted: " + new String(decryptedText, "UTF-8"));
    }
}

注意:實際應用中,金鑰的安全分發是對稱加密最大挑戰,這也是非對稱加密(公開金鑰基礎建設 PKI)應運而生的原因。

二、數位簽名:不可抵賴與身分驗證

數位簽名結合了非對稱加密與訊息摘要:簽名者用私鑰對資料摘要加密,驗證者用對應公鑰解密並比對摘要。這同時實現了資料完整性、身分認證與不可抵賴性。Java 透過 java.security.Signature 類別實作(如 SHA1withRSA、SHA256withRSA)。

三、最佳實務與建議

  • **演算法選擇**:現代應用建議使用 AES-256 (對稱) 與 RSA-2048+/ECC (非對稱) 與 SHA-256 (摘要)。
  • **金鑰管理**:切勿硬編碼金鑰於程式碼中,應使用 KeyStore、HSM 或雲端 KMS 服務。
  • **隨機數來源**:金鑰產生與 IV (初始化向量) 必須使用密碼學安全隨機數產生器 (SecureRandom)。
  • **例外處理**:妥善處理 NoSuchAlgorithmException、InvalidKeyException 等檢查型例外。

結語

Java 提供了豐富且標準化的密碼學 API (JCA/JCE),讓開發者能專注於業務邏輯而非底層數學實作。掌握本文介紹的核心類別與流程,即可在專案中落實資料加密、完整性校驗與數位簽名功能。安全是一場持久戰,持續關注演算法淘汰時間表與最新漏洞資訊,才是資安工程師的必修課。

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