字簽名深度解析:CAdES簽名、證書(shū)驗(yàn)證與簽署修訂分析完整指南)
KillerPDF數(shù)字簽名深度解析CAdES簽名、證書(shū)驗(yàn)證與簽署修訂分析完整指南【免費(fèi)下載鏈接】KillerPDFFree and open-source PDF editor for Windows with a built-in PDF 2.0 engine. View, annotate, OCR, merge, split, crop, rotate, compare, edit text, draw, sign, fill forms, print, flatten, and open password-protected PDFs without a subscription.項(xiàng)目地址: https://gitcode.com/gh_mirrors/ki/KillerPDFKillerPDF 是一款免費(fèi)開(kāi)源的 Windows PDF 編輯器內(nèi)置自研 PDF 2.0 引擎支持?jǐn)?shù)字簽名CAdES 分離式簽名、證書(shū)驗(yàn)證與簽署后的修訂分析無(wú)需訂閱即可為合同、表單簽署具有法律效力的電子簽名并審查簽名之后文檔被改動(dòng)過(guò)的每個(gè)對(duì)象。本文帶你從界面操作到源碼實(shí)現(xiàn)完整看懂 KillerPDF 數(shù)字簽名的三層架構(gòu)簽署、驗(yàn)證、修訂分析。手寫(xiě)簽名 ≠ 數(shù)字簽名先弄清兩者的區(qū)別KillerPDF 里有兩種容易混淆的簽名簽名印章工具Signature Stamp手繪一筆簽名或?qū)雸D片放到頁(yè)面上本質(zhì)是一張注釋圖片沒(méi)有密碼學(xué)效力數(shù)字簽名Digital Signature使用 X.509 證書(shū) 私鑰對(duì)文檔字節(jié)做 SHA-256 摘要并生成 CAdES 分離式 CMS 簽名任何字節(jié)被篡改都會(huì)導(dǎo)致驗(yàn)簽失敗。簽署入口在 SignDocumentDialog.cs 中定義注釋里明確寫(xiě)了這一點(diǎn)它是真正的數(shù)字簽名與只放置圖片的手繪簽名印章工具不同。一鍵簽署 PDF證書(shū)從哪來(lái)、簽名放哪里兩種證書(shū)來(lái)源.pfx 文件 或 Windows 證書(shū)存儲(chǔ)簽署對(duì)話框SignDocumentDialog.cs提供兩個(gè)單選項(xiàng)從文件加載選擇.pfx/.p12證書(shū)文件并輸入密碼由 PfxFileCertificateProvider.cs 以Exportable | PersistKeySet方式加載保證簽名器能訪問(wèn)私鑰從 Windows 個(gè)人證書(shū)存儲(chǔ)選擇WindowsCertificateStore.cs 會(huì)枚舉當(dāng)前用戶My存儲(chǔ)中所有帶私鑰且 Key Usage 允許數(shù)字簽名的證書(shū)供界面下拉選擇。兩個(gè)實(shí)現(xiàn)都通過(guò)統(tǒng)一接口 ICertificateProvider.cs 暴露——注釋說(shuō)明這是刻意為之讓證書(shū)存儲(chǔ)這種 Windows 專屬的部分隔離在最外層為未來(lái)的 Linux/macOS 移植留好空間??梢?jiàn)簽名外觀與簽署元數(shù)據(jù)勾選顯示可見(jiàn)簽名后你可以指定簽署頁(yè)碼與位置左下 / 右下 / 左上 / 右上簽名框尺寸與字號(hào)最小 72×36 點(diǎn)字號(hào) 6–72 點(diǎn)見(jiàn) TryBuildVisibleAppearance簽名文本模板支持{name}、{date}、{reason}、{location}占位符實(shí)時(shí)預(yù)覽ExpandAppearanceText。原因Reason、位置Location、聯(lián)系方式ContactInfo三項(xiàng)元數(shù)據(jù)會(huì)原樣寫(xiě)入簽名字典收件人打開(kāi) PDF 時(shí)可直接看到。簽署完成后KillerPDF 會(huì)另存一份新的-signed.pdf副本原文檔保持不變。CAdES 分離式簽名是如何寫(xiě)入 PDF 的簽署流程的核心是 PdfSigner.cs加載文檔 → 用證書(shū)構(gòu)建 CMS 簽名器 → 調(diào)用引擎的 PdfDetachedSignatureWriter.Sign 輸出簽署后的完整字節(jié)流。第一步生成 CAdES 分離式 CMS 簽名KillerCmsSigner.cs 只有 30 多行卻完成了最關(guān)鍵的密碼學(xué)動(dòng)作用SignedCms(content, detached: true)創(chuàng)建分離式簽名——摘要內(nèi)容不在 CMS 包里而是在 PDF 字節(jié)里摘要算法固定為SHA-256OID2.16.840.1.101.3.4.2.1IncludeOption WholeChain把整條證書(shū)鏈嵌入簽名ComputeSignature(signer, silent: false)特意傳silent: false這樣硬件令牌或云 KSP 需要 PIN 時(shí)可以彈出確認(rèn)提示。第二步ByteRange 占位符與增量修訂PDF 簽名有個(gè)雞生蛋問(wèn)題簽名值要寫(xiě)進(jìn)文檔但簽名值又要基于寫(xiě)簽名值之前的文檔計(jì)算。KillerPDF 的解法是兩步填充FillSignature先建增量修訂寫(xiě)入簽名字典SubFilter固定為ETSI.CAdES.detachedBuildSignatureDictionaryByteRange先填四個(gè)哨兵值111111111 / 222222222 / 333333333 / 444444444Contents預(yù)留一塊定長(zhǎng)十六進(jìn)制空格再回填真實(shí)偏移用交叉引用表定位簽名對(duì)象把真實(shí)字節(jié)偏移寫(xiě)回ByteRange固定 10 位十進(jìn)制避免寬度變化拼接兩段字節(jié)計(jì)算摘要把 CMS 簽名以大寫(xiě)十六進(jìn)制寫(xiě)進(jìn)預(yù)留區(qū)不足部分補(bǔ)0。這就是為什么你看到已簽名的 PDF 尾部總是...FF /ByteRange [0 12345 6789 54321]——中間那段空隙就是被簽名的縫。還有一組嚴(yán)謹(jǐn)?shù)氖匦l(wèi)規(guī)則PdfDetachedSignatureWriter在寫(xiě)入前會(huì)攔截大量非法場(chǎng)景Sign 入口場(chǎng)景處理方式字段已簽過(guò)名拒絕提示already signed文檔已是認(rèn)證文檔存在 DocMDP只允許通過(guò)既有簽名域追加簽署認(rèn)證權(quán)限為禁止一切變更P1拒絕任何后續(xù)修改密碼權(quán)限不足用戶口令打開(kāi)按表單填寫(xiě)/文檔修改權(quán)限分別攔截簽署域帶 /SV 種子值逐位校驗(yàn) SubFilter、摘要算法、理由、證書(shū)策略、時(shí)間戳服務(wù)器等約束EnforceSeedValue標(biāo)簽化 PDF有 StructTreeRoot自動(dòng)為簽名域建立結(jié)構(gòu)樹(shù)關(guān)聯(lián)AddTaggedSignatureAssociation保持無(wú)障礙結(jié)構(gòu)完整證書(shū)驗(yàn)證完整性與信任是兩回事驗(yàn)證端在引擎的 PdfSignatureVerifier.cs 提供兩個(gè)層次的 API這正是理解 PDF 驗(yàn)簽的關(guān)鍵VerifyIntegrity完整性驗(yàn)證只回答簽名覆蓋的字節(jié)有沒(méi)有被動(dòng)過(guò)、簽名值能否通過(guò)密碼學(xué)校驗(yàn)不檢查證書(shū)是否被系統(tǒng)信任VerifyTrust信任驗(yàn)證在完整性之上再調(diào)用CheckSignature(verifySignatureOnly: false)走系統(tǒng)證書(shū)鏈校驗(yàn)證書(shū)過(guò)期、被吊銷、自簽名不受信都會(huì)在這里暴露。注意它的容錯(cuò)設(shè)計(jì)Verify 方法信任校驗(yàn)失敗時(shí)不會(huì)直接判整個(gè)簽名無(wú)效而是返回結(jié)構(gòu)有效 密碼學(xué)有效 信任檢查失敗的組合結(jié)果——因?yàn)樽C書(shū)不受信和文檔被篡改是兩種完全不同的安全結(jié)論使用者需要看到差異。結(jié)構(gòu)層驗(yàn)證由 PdfSignatureReader.cs 完成它會(huì)把簽名域解析成一份 PdfSignatureInfo 記錄逐項(xiàng)檢查ByteRange是否有序、有界、且間隙恰好等于Contents字符串GapIsExactContentsStringContents去掉填充后是否是唯一的 ASN.1 CMS 值簽名是否覆蓋整個(gè)修訂CoversWholeDocumentDocMDP / FieldMDP 轉(zhuǎn)換參數(shù)認(rèn)證級(jí)別、字段鎖定動(dòng)作 All/Include/Exclude、鎖定字段名單。驗(yàn)證通過(guò)后GetSignedContent 按 ByteRange 精確拼接出被簽名的兩段字節(jié)交給SignedCms.CheckSignature完成最終比對(duì)。簽署修訂分析簽名之后誰(shuí)動(dòng)了文檔這是 KillerPDF 最有工程價(jià)值的一塊PdfSignedRevisionAnalyzer.cs。簽名后的 PDF 允許以增量修訂追加內(nèi)容分析器會(huì)回答簽名之后到底發(fā)生了什么切出簽署前綴取ByteRange覆蓋的字節(jié)區(qū)間嘗試獨(dú)立打開(kāi)為一個(gè)完整 PDF驗(yàn)證簽署修訂本身是合法 PDF枚舉后續(xù)修訂找出所有偏移量位于簽名區(qū)間之后的交叉引用段統(tǒng)計(jì)LaterRevisionCount對(duì)象級(jí)差異對(duì)比新舊交叉引用把變更對(duì)象分成四類——新增AddedObjectNumbers、更新UpdatedObjectNumbers、釋放FreedObjectNumbers及全部變更清單認(rèn)證權(quán)限評(píng)估PermissionAssessment文檔未認(rèn)證 →NotCertified無(wú)后續(xù)變更 →NoLaterChanges認(rèn)證級(jí)別為 P1 →Prohibited任何后續(xù)變更都違規(guī)其他級(jí)別 →RequiresSemanticReview提示需人工判斷變更是否在允許范圍內(nèi)。結(jié)果封裝在 PdfSignedRevisionAnalysis.cs 中HasLaterChanges屬性只需比較文檔當(dāng)前長(zhǎng)度與簽署修訂長(zhǎng)度即可判斷簽名后是否被追加過(guò)任何字節(jié)。配合 PDF 對(duì)比視圖你可以直觀看到每一處改動(dòng)模塊路徑速查去哪里讀源碼功能位置簽署對(duì)話框證書(shū)選擇、可見(jiàn)簽名預(yù)覽Controls/SignDocumentDialog.cs應(yīng)用層簽署編排Services/Signing/PdfSigner.csSHA-256 分離式 CMS 生成Services/Signing/KillerCmsSigner.cspfx 證書(shū) / Windows 證書(shū)存儲(chǔ)Services/Signing/PfxFileCertificateProvider.cs、WindowsCertificateStore.csCAdES 簽名寫(xiě)入ByteRange、增量修訂engine/KillerPdf.Engine/Signing/PdfDetachedSignatureWriter.cs簽名讀取與結(jié)構(gòu)驗(yàn)證engine/KillerPdf.Engine/Signing/PdfSignatureReader.cs完整性 / 信任雙級(jí)驗(yàn)證engine/KillerPdf.Engine/Signing/PdfSignatureVerifier.cs簽署修訂分析與權(quán)限評(píng)估engine/KillerPdf.Engine/Signing/PdfSignedRevisionAnalyzer.cs引擎簽名模塊測(cè)試engine/KillerPdf.Engine.Tests/Signing/應(yīng)用層簽署測(cè)試KillerPDF.Tests/PdfSignerTests.cs小結(jié)KillerPDF 的數(shù)字簽名實(shí)現(xiàn)可以概括為三條清晰的主線簽署走ETSI.CAdES.detached分離式簽名 ByteRange 占位回填兼容硬件令牌與嚴(yán)格種子值約束驗(yàn)證把完整性與證書(shū)信任拆成兩級(jí)結(jié)論避免不受信被誤讀為被篡改修訂分析把簽名后的增量修訂還原成新增/更新/釋放三類對(duì)象清單并給出 DocMDP 認(rèn)證權(quán)限下的保守評(píng)估。三者分別位于應(yīng)用層Services/Signing/與引擎層engine/KillerPdf.Engine/Signing/配合 docs/engine 目錄下的編輯文檔說(shuō)明足以覆蓋從入門(mén)使用到源碼研讀的完整路徑?!久赓M(fèi)下載鏈接】KillerPDFFree and open-source PDF editor for Windows with a built-in PDF 2.0 engine. View, annotate, OCR, merge, split, crop, rotate, compare, edit text, draw, sign, fill forms, print, flatten, and open password-protected PDFs without a subscription.項(xiàng)目地址: https://gitcode.com/gh_mirrors/ki/KillerPDF創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考