密碼學 - PKCS#7

在數位時代,安全通訊是至關重要的,無論是傳送敏感資訊還是驗證網站的真實性,密碼學都扮演著核心角色。其中,PKCS#7(Public-Key Cryptography Standard #7)是一項關鍵標準,定義了如何格式化已簽章或加密的資料。

本文將深入探討 PKCS#7 的功能、運作方式和實際應用,適合對密碼學有基本了解但不熟悉技術細節的讀者。

密碼學的背景

密碼學是確保通訊安全的科學,主要通過加密(將資料轉換為無法直接讀取的形式)和數位簽章(確認消息來源並確保完整性)來保護我們的數位交流。從古代的凱薩密碼(字母位移替換,如A替換為D)到現代的複雜演算法,密碼學已經歷了巨大的演變。密碼學的演變

1970年代末期,公開金鑰密碼學的出現徹底改變了通訊安全領域,允許雙方在不共享祕密的情況下安全通訊。隨著網際網路的普及,RSA實驗室於1990年代推出了PKCS(Public-Key Cryptography Standards)系列標準,而PKCS#7專注於定義加密消息的統一語法,為現代安全通訊協定如SSL/TLS奠定了基礎。

PKCS#7 是什麼?

PKCS#7 是一種標準,定義了用於儲存和傳輸已進行密碼學操作(如簽章或加密)資料的結構。該標準最初在1998年發布為RFC 2315(版本1.5),後來通過多次更新(RFC 2630、RFC 3369、RFC 3852和RFC 5652)演變為今天的密碼學消息語法(CMS)。
PKCS#7文件常見的儲存格式有兩種:

  • DER格式:二進制編碼,適合程式處理
  • PEM格式:DER的Base64編碼版本,包裹在特定標記之間,便於文本傳輸

在Windows系統中,這些檔案通常使用 .p7b.p7s 副檔名。

值得注意的是,PKCS#7 與 S/MIME 的關係經常被誤解。PKCS#7 演變為現代的 CMS (密碼消息語法),是一個獨立的密碼學標準,而 S/MIME 是一個應用層協定,它採用 CMS 作為其底層格式來實現安全電子郵件。這種關係是 CMS 作為底層標準被 S/MIME 使用,而非 S/MIME 定義了 PKCS#7/CMS。CMS 除了用於 S/MIME 外,還可用於其他應用場景,如文件簽章和軟體程式碼簽章。

PKCS#7的結構

PKCS#7 的主要功能

PKCS#7 支援多種內容類型,每種類型服務於不同的密碼學需求,以下簡單列舉幾種常見的內容類型:

內容類型描述對象標識符
data表示任意八位元字串,例如 ASCII 文本文件。{ pkcs-7 1 }
signedData包含任意類型的內容和零個或多個簽章者的加密消息摘要,包括用於分發證書和 CRL 的退化情況。{ pkcs-7 2 }

這些內容類型允許 PKCS#7 處理從簡單簽章到複雜加密的各種場景。

PKCS#7 的內部結構

PKCS#7的資料結構基於ASN.1(Abstract Syntax Notation One)定義,這是一種標準化描述資料格式的語言。下圖展示了一個典型的 signedData 結構:

1
2
3
4
5
6
7
8
SignedData ::= SEQUENCE {
version Version,
digestAlgorithms DigestAlgorithmIdentifiers,
contentInfo ContentInfo,
certificates [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
signerInfos SignerInfos
}

在這個結構中:

  • version:指示使用的PKCS#7版本
  • digestAlgorithms:用於產生訊息摘要的演算法(如SHA-256)
  • contentInfo:實際的資料或指向內容的指標
  • certificates:包含簽章者的證書或證書鏈
  • crls:可選的證書撤銷列表
  • signerInfos:包括簽章者的識別資訊和簽章值

這種結構化設計確保了資料的完整性和可驗證性,同時提供了良好的擴充性。

運作方式與實際應用

數位簽章流程

以下是使用PKCS#7創建和驗證數位簽章的典型流程:

  1. 產生摘要:計算原始資料的雜湊值(如使用SHA-256)
  2. 簽署摘要:使用私鑰加密雜湊值,產生數位簽章
  3. 打包資料:將原始資料、數位簽章和相關證書封裝為PKCS#7格式
  4. 驗證簽章:接收方使用公鑰解密簽章,比對計算出的雜湊值

實際應用場景

PKCS#7 在多個領域有廣泛應用:

  1. S/MIME 電子郵件安全
    • 應用:Gmail、Outlook等電子郵件客戶端使用PKCS#7格式的.p7s文件保護電子郵件
    • 功能:確保郵件未被竄改,驗證寄件者身份
  2. SSL/TLS證書鏈
    • 應用:網站伺服器如Apache、Nginx使用.p7b文件儲存證書
    • 功能:建立從根證書到終端實體證書的信任鏈
  3. 軟體簽章與驗證
    • 應用:Microsoft、Apple等使用PKCS#7簽章驗證軟體包
    • 功能:確保用戶下載的軟體來自合法來源,未被修改
  4. 金融交易安全
    • 應用:銀行業使用PKCS#7保護交易資料
    • 功能:確保交易指令的真實性和完整性
  5. 電子政務文件
    • 應用:政府機構使用PKCS#7簽署電子文件
    • 功能:賦予電子文件法律效力,等同實體簽章

實作案例:使用 OpenSSL 產生 PKCS#7 簽章

產生PKCS#7簽章

假設你有一個文件 data.txt,以及一對私鑰與證書(private.key和cert.pem):

1
2
3
4
5
# 產生PKCS#7簽章
openssl smime -sign -in data.txt -out data.p7s -signer cert.pem -inkey private.key -outform PEM

# 產生不分離的簽章(包含原始資料)
openssl smime -sign -in data.txt -out data.p7s -signer cert.pem -inkey private.key -outform PEM -nodetach

驗證PKCS#7簽章

接收者可以使用以下命令驗證簽章:

1
2
3
4
5
# 驗證分離簽章
openssl smime -verify -in data.p7s -inform PEM -content data.txt -CAfile ca-cert.pem

# 驗證不分離簽章
openssl smime -verify -in data.p7s -inform PEM -CAfile ca-cert.pem

查看PKCS#7文件內容

1
2
# 以文本形式顯示PKCS#7文件的內容
openssl pkcs7 -in data.p7s -inform PEM -print_certs -text

完整範例:企業文件簽署系統

以下是一個企業文件簽署系統使用PKCS#7的完整場景:

整個系統分為三個階段:準備階段、簽署流程和驗證流程。系統實現了端到端的文件簽署和驗證過程,確保文件在傳輸過程中保持完整性和可驗證性。這種系統在法律合同、財務報表和企業間保密文件交換中尤為重要。

PKCS#7與現代標準的比較

特性PKCS#7 (RFC 2315)CMS (RFC 5652)S/MIME v4TLS 1.3
發布時間1998年2009年2019年2018年
支援的簽章演算法RSA, DSARSA, DSA, ECDSARSA, ECDSA, EdDSAECDSA, EdDSA, RSA-PSS
支援的雜湊演算法MD5, SHA-1SHA-1, SHA-2系列SHA-2系列SHA-2系列
量子計算抵抗性未支援未支援部分支援有限支援
主要應用領域電子郵件、證書鏈一般密碼訊息電子郵件安全網路安全

安全考量與最佳實踐

使用PKCS#7時,應注意以下安全考量:

  1. 避免過時演算法:
    • 不要使用MD5或SHA-1等已被證明存在漏洞的雜湊演算法
    • 推薦使用SHA-256或更強的雜湊演算法
  2. 金鑰長度選擇:
    • RSA金鑰至少使用2048位元(建議4096位元)
    • ECDSA金鑰至少使用P-256曲線
  3. 證書驗證:
    • 總是檢查整個證書鏈的有效性
    • 驗證證書是否在CRL或OCSP回應中被撤銷
  4. 時間戳記:
    • 考慮為簽章添加時間戳記,確保簽章時間的可驗證性
    • 使用可信的時間戳記服務
  5. 格式驗證:
    • 謹慎處理ASN.1解析,防止緩衝區溢出等漏洞
    • 限制處理的PKCS#7文件大小

PKCS#7的局限性與挑戰

雖然PKCS#7廣泛應用,但也存在一些局限性:

  1. 演算法靈活性有限:
    • 原始標準未充分考慮新興密碼學演算法
    • 對抗量子計算的演算法支援不足
  2. 複雜性:
    • ASN.1結構複雜,學習曲線陡峭
    • 實現和測試困難,容易出現安全漏洞
  3. 與現代標準共存:
    • CMS逐漸取代PKCS#7,但兩者需要互操作
    • 舊系統依賴PKCS#7,新系統採用CMS,需要兼容處理

未來發展趨勢

PKCS#7及其衍生標準CMS的未來發展方向包括:

主要發展方向詳細解釋:

  1. 支援後量子密碼學:
    • 整合抗量子演算法,如格基密碼學和雜湊基密碼學
    • 確保在量子計算時代仍然安全的金鑰交換和簽章機制
  2. 區塊鏈整合:
    • 與區塊鏈技術結合,提供去中心化的分散式信任機制
    • 為智慧合約提供可靠的數位簽章和身份驗證
  3. IoT適配:
    • 開發輕量級實現,減少資源需求,適合資源受限設備
    • 最佳化處理效能和能源消耗,延長電池壽命
  4. 標準統一:
    • 與其他密碼學標準更好地整合,提供跨平台兼容性
    • 簡化API和使用複雜度,提高開發者體驗

結論

PKCS#7作為數位簽章和加密資料的標準容器,在過去二十多年來支撐了全球安全通訊的基礎設施。雖然它正逐漸被CMS取代,但其設計原則和核心概念仍然影響著現代密碼學實踐。對於任何從事資訊安全的專業人士來說,理解PKCS#7的工作原理都是必不可少的知識基礎。
隨著密碼學不斷發展,PKCS#7及其衍生標準將繼續適應新的威脅和需求,為數位世界的安全通訊提供堅實保障。無論是電子郵件安全、網站認證還是軟體分發,PKCS#7的影響都將持續很長時間。

參考資料

  • PKCS 7 - Wikipedia
  • RFC 2315 - PKCS #7: Cryptographic Message Syntax Version 1.5
  • RFC 5652 - Cryptographic Message Syntax (CMS)
  • A SSL Certificate File Extension Explanation: PEM, PKCS7, DER, and PKCS#12 - Comodo SSL Resources
  • OpenSSL PKCS#7 Documentation

也許你也會想看看