882 字
4 分鐘
簽章篇(3–2) RAW、DER、ASN.1 | 深入淺出自然人憑證
2024-01-02
無標籤

從前兩篇文我們了解到,/sign 這支 API,支援了 PKCS1、PKCS7、RAW 三種作法做簽章,其中 RAW 也是做 PKCS1 簽章。具體來說差在哪,本篇將會說明。


PKCS#1 VS RAW#

複習一下 PKCS#1 與 RAW 的差別,主要在執行 Hash 的位置,PKCS#1 是將 tbs 與 Hash 演算法傳送到 API 進行運送;RAW 則是將 tbs 進行 Hash 後,將結果轉為 DER 格式並傳送到 API。

由於自然人憑證運算力不強,若是原文太大,可能無法在卡內進行 Hash 運算。因此我們可以選擇在卡片外面執行好上述兩步驟,再將填充的 Hash 傳到卡片上進行簽章。同一個原文,在 PKCS#1 與 RAW 算出來的結果簽章值會相同。


DER(Distinguished Encoding Rules)#

前面講到的 DER 是一種 ASN.1 的二進制編碼標準,用於將資料結構進行編碼。DER 保證唯一性、最小表示,支援遞歸編碼,採用標籤-長度-值結構。其定義的編碼方式確保了資料結構的一致性,並廣泛應用於數位簽章、憑證、LDAP 等領域,確保資料準確性和安全性。


RAW 簽章範例#

RAW簽章範例說明了用 RAW 簽核出來的結果會與 PKCS1 相同,圖片下面也告訴我們製作「製作 DER」的方法。因此我這裡整理一下製作「製作 DER」方法:

  1. 將 TBS 做 Hash
  2. 將 Hash 前面加上 Hash Prefix,上述[0x30, 0x21, 0x30, ...]為 SHA1 的 Hash Prefix,每個 Hash 演算法的 Prefix 不同
  3. 將新字串轉成 Base64,完成製作 DER

Hash Prefix#

每個 Hash 驗算法都會有不同的 Prefix 字串,這就要講到RFC 4880。
RFC 4880 是 IETF 發佈的《OpenPGP Message Format》標準檔案,定義了OpenPGP 協定的消息格式,包括加密和簽署電子通訊的標準。OpenPGP 提供了一套加密和數字簽名協定,用於保護電子郵件、檔案傳輸等。RFC 4880細節描述了 OpenPGP 消息的結構、數據格式、加密和簽名演算法,確保不同實現的軟體能夠相容並共同遵循相同的標準,確保 OpenPGP 的互通性。

RFC 4880 的 5.2.2 就有提到各演算法的 prefix 內容與物件編號(OID),如下圖所示。

在其他語言的程式碼中可以找到相關內容。


ASN.1#

ASN.1(Abstract Syntax Notation One)是一種標準的資料結構描述和編碼方法,用於跨平台、跨語言的資料交換。它提供了抽象的結構描述符和編碼規則,使不同系統能共同使用相同的資料結構,促進通訊協定、安全標準和其他應用的互通性。ASN.1的編碼方式包括基本編碼規則(BER)和區別編碼規則(DER),用於將結構化資料轉換為二進制形式,常見於X.509憑證、LDAP和SNMP等協定中。

比方說 tbs 的 SHA1 為E7602A0C5A31FAE24E3DE1BC81DF3A75FF546378。透過上述方法轉為 DER 為MCEwCQYFKw4DAhoFAAQU52AqDFox+uJOPeG8gd86df9UY3g=。另外可以解析 ASN.1 的格式。

以下透過 openssl 進行 asn1parse 做 decode,可以看出演算法為 SHA1,下面包含 tbs 的 Hash 結果。

也可以透過網頁 ASN.1 JavaScript decoder 進行解析。解析的內容可以看出,1.3.14.3.2.26 代表演算法的物件編號(OID),可以得知為 SHA1 與 Hash 值。


結語#

本篇介紹了 RAW 使用 DER 格式進行封裝,並了解了ASN.1格式與相關解析方法。

▶ 閱讀更多:深入淺出自然人憑證