
自然人憑證做數位簽章是採用 PKCS 標準,前文已經先說明過 PKCS,建議先閱讀。
自然人憑證的數位簽章
自然人憑證支援 PKCS#1、PKCS#7 兩種上述標準做數位簽章,在 Hash 則支援了 MD4、MD5、SHA1、SHA2、SHA3 等方法,可以依據需求選擇 PKCS 與 Hash。
至於 PKCS#1、PKCS#7 兩者簽章後的具體差異為,PKCS#1 簽章完的內容只包含了用私鑰加密後的簽章值;而 PKCS#7 則可以包含憑證、多個數位簽章、原始資料、時間戳記、PKCS#1簽章值等。所以同一串 tbs,PKCS#1 每次簽章完的簽章值結果會相同,但 PKCS#7 包含了時間戳記,每次簽章完的簽章值會不同。
在自然人憑證上有兩組憑證,分別用於數位簽章與資料加密,而 PKCS#1、PKCS#7 兩者做數位簽章,都是用數位簽章專用的憑證來加解密。兩組憑證由內政部憑證中心生成,並把公鑰、私鑰存在卡上。公鑰可以透過 API 存取,但是私鑰是無法取得的。
PKCS#1 原理
PKCS#1 定義了使用 RSA 非對稱加密演算法進行數位簽章的過程。以下是 PKCS#1 中數位簽章的基本過程:
- 簽署過程(Signing):
(1) 選擇資料: 使用者選擇要簽署的資料。
(2) 計算 Hash: 使用適當的雜湊函數(例如 SHA-256),計算資料的 Hash。
(3) 填充(Padding): 將 Hash 值填充到合適的長度,以符合 RSA 簽署的要求。
(4) 簽署: 使用私鑰對填充後的 Hash 進行加密,形成數位簽章。 - 驗證過程(Verifying):
(1) 收到原文和簽章值: 接收方收到原始資料和相應的數位簽章。
(2) 解密簽名: 使用發送方的公鑰對數位簽章進行解密,得到填充後的 Hash。
(3) 去填充: 將填充後的 Hash 去除填充,取得 Hash。
(4) 計算 Hash: 接收方對原始資料應用相同的雜湊函數,生成自己的Hash。
(5) 比對 Hash: 接收方將解密得到的 Hash 和自己計算的 Hash 進行比對。如果相符,則數位簽章驗證成功。
需要注意的是,PKCS#1 定義了特定的填充方案,例如 PKCS#1 v1.5 padding,來確保數位簽章的安全性。填充是為了確保訊息的長度滿足 RSA 簽署的要求,同時還包括隨機性以提高安全性。整個過程中,私鑰用於簽署,公鑰用於驗證,確保數位簽章的真實性和完整性。
PKCS#7 原理
PKCS#7 中的數位簽章過程通常涉及 SignedData 資料結構。以下是 PKCS#7 做數位簽章的一般過程:
- 簽署過程(Signing):
(1) 選擇資料: 使用者選擇要簽署的資料。
(2) 計算 Hash: 使用適當的雜湊函數(例如 SHA-256),計算資料的 Hash。
(3) 簽署: 使用私鑰對 Hash 進行加密,形成數位簽章。
(4) 構建 SignerInfo:將數位簽章和相應的憑證構建為 SignerInfo 結構,包含簽署者的識別資訊(通常是發送者的憑證)和簽署的時間戳。
(5) 構建 SignedData :構建 SignedData 資料結構,包含原始資料、 SignerInfo、可能的其他數位簽章、憑證鏈和其他相關的資料。 - 驗證過程(Verifying):
(1) SignedData 解析:接收者解析接收到的 SignedData 資料結構。
(2) 數位簽章驗證:對每個 SignerInfo 中的數位簽章進行驗證,使用相應的公鑰和憑證,確保簽章的有效性。
(3) 原始資料 Hash 驗證:對比接收到的原始資料的 Hash 與 SignerInfo 中的 Hash,確保訊息的完整性。
(4) 憑證驗證:驗證發送者的憑證是否有效,並檢查它是否由可信的 CA 簽署。
整體而言,PKCS#7 中的數位簽章過程確保了訊息的完整性、數位簽章的驗證、憑證的有效性,從而確保訊息在傳輸過程中的安全性。
結語
本篇說明了數位簽章的用途與原理,並講到自然人憑證支援的標準,下一篇會分別介紹如何用 PKCS#1、PKCS#7 在自然人憑證做簽章。
▶ 閱讀更多:深入淺出自然人憑證