如何在 Java 中使用 GroupDocs.Signature 加密元資料

數位簽章非常好,但隱藏的文件屬性——作者姓名、時間戳記、內部 ID——仍可能以純文字形式洩漏。如果您需要了解如何加密元資料,本指南將會示範,使用 GroupDocs.Signature 彈性的 API。完成本教學後,您將能夠:

  • 在 Java 文件中序列化自訂元資料結構。
  • 套用加密(範例使用 XOR 以示說明,但您會看到如何改用 AES)。
  • 在簽署文件的同時嵌入加密的元資料。
  • 將解決方案擴展至生產級的安全性與效能。

讓我們開始吧。

快速解答

  • 「加密元資料」是什麼意思? 它在簽署前以加密轉換保護隱藏的文件屬性。
  • 需要哪個函式庫? GroupDocs.Signature for Java 23.12 或更新版本。
  • 需要授權嗎? 免費試用可用於開發;正式環境必須使用完整授權。
  • 我可以將 XOR 換成更強的演算法嗎? 是的——實作 AES‑GCM 或其他已驗證的方案。
  • 此方法是否與格式無關? GroupDocs.Signature 支援超過 30 種檔案格式,包括 DOCX、PDF、XLSX、PPTX 等。

什麼是 Java 文件元資料加密?

在 Java 中加密文件元資料是指取得隨檔案一起傳遞的隱藏屬性,並套用加密轉換,使只有授權方能讀取。這可保護內部 ID、審閱者備註及其他敏感資料免於隨意檢視。

為何要加密文件元資料?

加密元資料可保護可能用於識別個人或揭露內部流程的敏感資訊。透過將這些隱藏屬性轉換為密文,您可符合 GDPR、HIPAA 等法規,維持稽核追蹤的完整性,並防止競爭者提取關鍵業務資料。此安全層與可見的數位簽章相輔相成,確保整份文件保持機密。

前置條件

必要的函式庫與相依性

  • GroupDocs.Signature for Java(版本 23.12 或更新)– 核心簽署函式庫。
  • Java Development Kit (JDK) – JDK 8 或以上。
  • Maven 或 Gradle 用於相依性管理。

環境設定

建議使用具 Maven/Gradle 專案的 Java IDE(IntelliJ IDEA、Eclipse 或 VS Code)。

知識前提

  • 基本的 Java(類別、方法、物件)。
  • 了解文件元資料概念。
  • 熟悉對稱式加密基礎。

設定 GroupDocs.Signature for Java

選擇您的建置工具並加入相依性。

Maven:

<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-signature</artifactId>
    <version>23.12</version>
</dependency>

Gradle:

implementation 'com.groupdocs:groupdocs-signature:23.12'

或者,您也可以直接從 GroupDocs.Signature for Java releases 下載 JAR 檔,手動加入專案(雖然建議使用 Maven/Gradle)。

取得授權步驟

  • Free Trial – 限時提供完整功能。
  • Temporary License – 延長評估。
  • Full Purchase – 正式生產使用。

基本初始化與設定

Signature 類別是 GroupDocs.Signature 的核心物件,用於載入文件、套用簽章,並將結果寫回磁碟。

Signature signature = new Signature("YOUR_DOCUMENT_PATH");

將 "YOUR_DOCUMENT_PATH" 替換為您實際的 DOCX、PDF 或其他支援檔案路徑。

Pro tip: 將 Signature 物件包在 try‑with‑resources 區塊中,或明確呼叫 close(),以避免記憶體洩漏。

實作指南

如何在 Java 中建立自訂元資料結構

自訂的元資料類別定義了您想要保護的資訊結構,以及 GroupDocs.Signature 如何序列化它。透過在欄位上加上 @FormatAttribute 註解,您告訴函式庫每個元素的順序與格式,從而實現一致的加密與後續的反序列化。此類別成為簽署文件中嵌入的加密負載的藍圖。

class DocumentSignatureData {
    @FormatAttribute(propertyName = "SignID")
    private String ID;
    
    public String getID() { return ID; }
    public void setID(String value) { ID = value; }

    @FormatAttribute(propertyName = "SAuth")
    private final String Author;

    public final String getAuthor() { return Author; }
    public DocumentSignatureData(String author) { this.Author = author; }

    @FormatAttribute(propertyName = "SDate", propertyFormat = "yyyy-MM-dd")
    private Date Signed = new Date();

    public final Date getSigned() { return Signed; }
    public void setSigned(Date value) { Signed = value; }

    @FormatAttribute(propertyName = "SDFact", propertyFormat = "N2")
    private BigDecimal DataFactor = new BigDecimal(0.01);

    public final BigDecimal getDataFactor() { return DataFactor; }
    public void setDataFactor(BigDecimal value) { DataFactor = value; }
}
  • @FormatAttribute 告訴 GroupDocs.Signature 如何序列化每個欄位。
  • 依需求為此類別擴充任何額外的屬性。

為文件元資料實作自訂加密

實作自訂加密例程讓您能控制元資料位元組在儲存前的轉換方式。透過建立實作 IDataEncryption 介面的類別,您可以插入任何演算法——示範用的 XOR、正式環境的 AES‑GCM,甚至是自有方案。簽署過程會在元資料序列化時自動呼叫您的加密器。

class CustomXOREncryption implements IDataEncryption {
    @Override
    public byte[] encrypt(byte[] data) {
        byte key = 0x5A; 
        byte[] encryptedData = new byte[data.length];
        for (int i = 0; i < data.length; i++) {
            encryptedData[i] = (byte) (data[i] ^ key);
        }
        return encryptedData;
    }

    @Override
    public byte[] decrypt(byte[] data) {
        // XOR decryption uses the same logic as encryption
        return encrypt(data);  
    }
}

Important: XOR 不適用於正式環境的安全需求。部署前請改用 AES‑GCM 或其他已驗證的演算法。

如何使用加密元資料簽署文件

在簽署文件的同時嵌入加密的元資料,將隱藏資訊與數位簽章綁定,確保真偽與機密性。使用 MetadataSignOptions,您可指定要包含的元資料欄位並提供加密實作。Signature 物件隨後處理文件、套用簽章,並將加密負載寫入可見簽章元素旁邊。

MetadataSignOptions 是告訴 GroupDocs.Signature 要嵌入哪些元資料以及如何加密的設定物件。

DocumentSignatureData 保存將被序列化與加密的實際值。

WordProcessingMetadataSignature 代表單一元資料項目(例如作者、客製 ID),將附加於 Word 處理文件。

class SignWithMetadataCustomSerialization {
    public static void run() throws Exception {
        String filePath = "YOUR_DOCUMENT_DIRECTORY/SampleDocument.docx";
        String outputFilePath = new File("YOUR_OUTPUT_DIRECTORY", "SignedDocument.docx").getPath();

        try {
            Signature signature = new Signature(filePath);
            
            // Custom encryption instance
            IDataEncryption encryption = new CustomXOREncryption();
            
            MetadataSignOptions options = new MetadataSignOptions();
            options.setDataEncryption(encryption);

            DocumentSignatureData documentSignature = new DocumentSignatureData(System.getenv("USERNAME"));
            documentSignature.setID(java.util.UUID.randomUUID().toString());
            documentSignature.setSigned(new Date());
            documentSignature.setDataFactor(new BigDecimal("11.22"));

            WordProcessingMetadataSignature mdSignature = new WordProcessingMetadataSignature(
                "Signature", documentSignature);
            WordProcessingMetadataSignature mdAuthor = new WordProcessingMetadataSignature(
                "Author", "Mr.Scherlock Holmes");
            WordProcessingMetadataSignature mdDocId = new WordProcessingMetadataSignature(
                "DocumentId", java.util.UUID.randomUUID().toString());

            options.getSignatures().add(mdSignature);
            options.getSignatures().add(mdAuthor);
            options.getSignatures().add(mdDocId);

            signature.sign(outputFilePath, options);
        } catch (Exception e) {
            throw new Exception(e.getMessage());
        }
    }
}

步驟說明

  1. 初始化 使用來源檔案的 Signature。
  2. 建立 IDataEncryption 實作(CustomXOREncryption)。
  3. 設定 MetadataSignOptions 並附加加密實例。
  4. 填充 DocumentSignatureData 以您的自訂欄位。
  5. 建立 每筆元資料的 WordProcessingMetadataSignature 物件。
  6. 加入 它們至選項集合,並呼叫 sign()。

Pro tip: 使用 System.getenv("USERNAME") 可自動取得目前的作業系統使用者,對於稽核追蹤相當便利。

何時使用此方法

當文件包含機密識別碼、內部備註或必須避免未授權讀者取得的法規資料時,加密元資料是理想的做法。情境包括隱藏條款編號的法律合約、含有專有計算的財務報表、帶有患者 ID 的醫療紀錄,以及每個參與者僅能看到自身元資料的多方協議。對於完全公開的文件,此步驟可能不必要。

情境為何要加密元資料?
法律合約隱藏內部工作流程 ID 與審閱者備註。
財務報告保護計算來源與機密數字。
醫療紀錄保護患者識別碼與處理備註(HIPAA)。
多方協議確保只有授權方能檢視嵌入的元資料。

對於需要透明的完全公開文件,請避免使用此技術。

安全性考量:超越 XOR 加密

為何 XOR 不足

XOR 加密僅是簡單的資料遮蔽,缺乏保護敏感元資料所需的密碼強度。靜態金鑰可能透過頻率分析被破解,且未內建完整性驗證,使負載易受竄改。為符合合規與安全需求,請將 XOR 換成具驗證功能的加密模式,例如 AES‑GCM,提供機密性與防篡改檢測。

生產級替代方案

AES‑GCM 範例(概念性):

// Example pattern (not complete implementation)
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] encrypted = cipher.doFinal(data);
  • 同時提供機密性 與 認證。
  • 被 NIST 認可,廣泛應用於企業安全。

金鑰管理: 將金鑰存放於安全保管庫(AWS KMS、Azure Key Vault),切勿硬編碼金鑰。

Action item: 將 CustomXOREncryption 替換為實作 IDataEncryption 的 AES 類別。其餘簽署程式碼保持不變。

常見問題與解決方案

元資料未加密

  • 確認已呼叫 options.setDataEncryption(encryption)。
  • 確認您的加密類別正確實作 IDataEncryption。

文件簽署失敗

  • 檢查檔案是否存在以及寫入權限。
  • 確保授權已啟用(試用版可能已過期)。

簽署後解密失敗

  • 加密與解密操作使用相同的金鑰。
  • 確認您讀取的是正確的元資料欄位。

大檔案的效能瓶頸

  • 批次處理文件(一次 10–20 份)。
  • 及時釋放 Signature 物件。
  • 分析您的加密演算法;相較於 XOR,AES 只會帶來適度的額外負擔。

疑難排解指南

Signature 初始化失敗:

try {
    Signature signature = new Signature(filePath);
} catch (Exception e) {
    System.err.println("Failed to load document: " + e.getMessage());
    // Verify: file exists, correct format, sufficient permissions
}

加密例外:

if (data == null || data.length == 0) {
    throw new IllegalArgumentException("Cannot encrypt empty data");
}

簽署後缺少元資料:

System.out.println("Signatures added: " + options.getSignatures().size());
// Should be > 0

效能考量

  • 記憶體: 釋放 Signature 物件;大量工作時使用固定大小的執行緒池。
  • 速度: 快取加密實例以減少物件建立開銷。
  • 基準測試(約):
    • 5 MB DOCX 使用 XOR:200‑500 毫秒
    • 同檔案使用 AES‑GCM:約 250‑600 毫秒

生產環境最佳實踐

  1. 將 XOR 換成 AES(或其他已驗證的演算法)。
  2. 使用安全金鑰存儲——切勿在原始碼中嵌入金鑰。
  3. 記錄簽署操作(誰、何時、哪個檔案)。
  4. 驗證輸入(檔案類型、大小、元資料格式)。
  5. 實作完整的錯誤處理,提供清晰訊息。
  6. 在上線前於測試環境測試解密。
  7. 保留稽核追蹤以符合合規需求。

結論

您現在已掌握使用 GroupDocs.Signature 加密元資料 的完整步驟說明:

  • 使用 @FormatAttribute 定義具型別的元資料類別。
  • 實作 IDataEncryption(示範使用 XOR)。
  • 簽署文件時附加加密的元資料。
  • 升級至 AES 以達到生產級安全性。

接下來的步驟:嘗試不同的加密演算法、整合安全金鑰管理服務,並擴充元資料模型以符合您的特定業務需求。

常見問答

Q: 我可以使用除 XOR 之外的其他加密演算法嗎?
A: 當然可以。實作任何符合 IDataEncryption 介面的類別——建議使用 AES‑GCM,以獲得強大的機密性與完整性。

Q: 切換至 AES 時需要修改簽署程式碼嗎?
A: 不需要。只要您的自訂 AES 實作符合 IDataEncryption,即可直接將 CustomXOREncryption 實例換成新類別。

Q: 若以一般檢視器開啟已簽署的檔案,會看到加密的元資料嗎?
A: 元資料仍然是檔案的一部份,但會顯示為不可讀的二進位資料。只有您的解密程式能解讀它。

Q: 這會對檔案大小產生什麼影響?
A: 加密僅增加極少的開銷(通常每個元資料欄位只有幾個位元組),對整體文件大小的影響可忽略不計。

Q: 生產環境需要什麼授權?
A: 商業部署必須購買完整的 GroupDocs.Signature 授權。開發與測試階段可使用試用授權。


最後更新: 2026-07-06
測試環境: GroupDocs.Signature 23.12(Java)
作者: GroupDocs

相關教學