第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Google KMS 和 Entrust 證書簽署 PDF 文檔

使用 Google KMS 和 Entrust 證書簽署 PDF 文檔

慕桂英3389331 2023-07-28 10:44:32
我正在嘗試使用 CA (Entrust) 的證書在 pdf 文檔中進行有效簽名,該證書是使用 Google KMS 的私鑰生成的(私鑰永遠不會從 KMS 中流出)。證書鏈的構(gòu)成為:[entrustCert,intermediate,rootCert]按照我用來實現(xiàn)此目的的代碼部分:String DEST = "/tmp/test_file.pdf";OutputStream outputFile = new FileOutputStream(DEST);CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");X509Certificate[] chain = new X509Certificate[3];chain[0] = (X509Certificate) certificateFactory.generateCertificate(entrustCert);chain[1] = (X509Certificate) certificateFactory.generateCertificate(intermediateCert);chain[2] = (X509Certificate) certificateFactory.generateCertificate(rootCert);int estimatedSize = 8192;PdfReader reader = new PdfReader(contract);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();PdfStamper stamper = PdfStamper.createSignature(reader, outputStream, '\0');PdfSignatureAppearance appearance = stamper.getSignatureAppearance();appearance.setReason(“reason”);appearance.setLocation("Amsterdam");appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");appearance.setCertificate(chain[0]);PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);dic.setReason(appearance.getReason());dic.setLocation(appearance.getLocation());dic.setContact(appearance.getContact());dic.setDate(new PdfDate(appearance.getSignDate()));appearance.setCryptoDictionary(dic);HashMap<PdfName, Integer> exc = new HashMap<>();exc.put(PdfName.CONTENTS, (estimatedSize * 2 + 2));appearance.preClose(exc);String hashAlgorithm = DigestAlgorithms.SHA256;BouncyCastleDigest bcd = new BouncyCastleDigest();PdfPKCS7 sgn = new PdfPKCS7(null, chain, hashAlgorithm, null, bcd, false);InputStream data = appearance.getRangeStream();byte[] hash = DigestAlgorithms.digest(data, MessageDigest.getInstance("SHA-256"));byte[] sh = sgn.getAuthenticatedAttributeBytes(hash, null, null, MakeSignature.CryptoStandard.CMS);目前我遇到以下問題:每個簽名均無效:自應用簽名以來,文檔已被更改或損壞。Google 的簽名驗證總是錯誤的。
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經(jīng)驗 獲得超6個贊

損壞的消息摘要值

文件簽名失敗.pdf分析

在所包含的簽名容器的 ASN.1 轉(zhuǎn)儲中,有一個問題立即引人注目:該messageDigest屬性包含應有的簽名屬性的副本,即具有正確的messageDigest屬性:

? ? <30 5C>

4172? ?92: . . . . . . SEQUENCE {

? ? <06 09>

4174? ? 9: . . . . . . . OBJECT IDENTIFIER messageDigest (1 2 840 113549 1 9 4)

? ? ? ? ?: . . . . . . . . (PKCS #9)

? ? <31 4F>

4185? ?79: . . . . . . . SET {

? ? <04 4D>

4187? ?77: . . . . . . . . OCTET STRING, encapsulates {

? ? <31 4B>

4189? ?75: . . . . . . . . . SET {

? ? <30 18>

4191? ?24: . . . . . . . . . . SEQUENCE {

? ? <06 09>

4193? ? 9: . . . . . . . . . . . OBJECT IDENTIFIER

? ? ? ? ?: . . . . . . . . . . . . contentType (1 2 840 113549 1 9 3)

? ? ? ? ?: . . . . . . . . . . . . (PKCS #9)

? ? <31 0B>

4204? ?11: . . . . . . . . . . . SET {

? ? <06 09>

4206? ? 9: . . . . . . . . . . . . OBJECT IDENTIFIER data (1 2 840 113549 1 7 1)

? ? ? ? ?: . . . . . . . . . . . . . (PKCS #7)

? ? ? ? ?: . . . . . . . . . . . . }

? ? ? ? ?: . . . . . . . . . . . }

? ? <30 2F>

4217? ?47: . . . . . . . . . . SEQUENCE {

? ? <06 09>

4219? ? 9: . . . . . . . . . . . OBJECT IDENTIFIER

? ? ? ? ?: . . . . . . . . . . . . messageDigest (1 2 840 113549 1 9 4)

? ? ? ? ?: . . . . . . . . . . . . (PKCS #9)

? ? <31 22>

4230? ?34: . . . . . . . . . . . SET {

? ? <04 20>

4232? ?32: . . . . . . . . . . . . OCTET STRING? ??

? ? ? ? ?: . . . . . . . . . . . . . 40 76 BC 3F 05 25 E4 C3? ? @v.?.%..

? ? ? ? ?: . . . . . . . . . . . . . 27 AD 78 FA 73 31 4C 1B? ? '.x.s1L.

? ? ? ? ?: . . . . . . . . . . . . . 82 97 3D AA 4E 81 72 D6? ? ..=.N.r.

? ? ? ? ?: . . . . . . . . . . . . . 23 3C DD 59 D2 82 81 55? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ?: . . . . . . . . . . . . }

? ? ? ? ?: . . . . . . . . . . . }

? ? ? ? ?: . . . . . . . . . . }

? ? ? ? ?: . . . . . . . . . }

? ? ? ? ?: . . . . . . . . }

? ? ? ? ?: . . . . . . . }

事實上,在您的代碼中,原因變得很清楚:


byte[] sh = sgn.getAuthenticatedAttributeBytes(hash, null, null, MakeSignature.CryptoStandard.CMS);

[...]

byte[] encodedSig = sgn.getEncodedPKCS7(sh, tsaClient, null, null, MakeSignature.CryptoStandard.CMS);

這兩個調(diào)用必須具有相同的參數(shù)(除了在第二個位置添加的參數(shù)tsaClient),因為在第一個調(diào)用中檢索到的經(jīng)過身份驗證的屬性(也稱為簽名屬性)是實際簽名的字節(jié),因此必須使用相同的輸入創(chuàng)建最終的簽名容器有效的。


(如果你的變量名更清晰,這個問題可能會更早被發(fā)現(xiàn)。)


因此,要修復簽名屬性,請?zhí)鎿Q


byte[] encodedSig = sgn.getEncodedPKCS7(sh, tsaClient, null, null, MakeSignature.CryptoStandard.CMS);

經(jīng)過


byte[] encodedSig = sgn.getEncodedPKCS7(hash, tsaClient, null, null, MakeSignature.CryptoStandard.CMS);

RSA 填充

在努力解決上述問題后,出現(xiàn)了一個新問題:“內(nèi)部加密庫錯誤。錯誤代碼:0x2726”


test_file.pdf分析


使用簽名者證書的 RSA 公鑰解密簽名字節(jié)會導致


2D9B224E0894E73B1D3EDEE43E5C34A152057B008518538F3D6DA9C5AC73B54AEF33EB165ED0815F2E7851C86308AAFEC3FC0CD5CA77D7A745C056CB37783B7B51484D9B6C1F6D7E42C2B1C49127CD7D1C3A371D943A5C6F5DDA47C758493D2D3CA7D165B35A1BE4FA590911E801D7026822A9B9D202AE9A671DF4F36D42AAD712D43506EC3607E5AC7CCE23389BE288DD32C9C45B92CAA7225897EFD9F8ECFE2A40007FD6AC8B625239E6E529B7521E2EB652659A8F8B3F7262D46E8A0207A3004FEF48C87FC8A52B632268FDD0888A00AE6A3B303A138B18F28A66108467BFF743A859ECD193ADB52268B1FC531690B99D35D5E68BF804B59E24FCB180FABC

這顯然看起來不像 PKCS1v1.5 填充的哈希值。因此,要么所謂的簽名者證書是錯誤的,我們看到本質(zhì)上是垃圾,要么簽名根本不使用 PKCS1v1.5 填充,而是使用 PSS 填充。尾隨BC是后者的指示符,但垃圾也可能以 結(jié)尾BC。


但與此同時,OP 已確認:


Google KMS 中生成的私鑰是 2048 位 RSA 密鑰 PSS Padding - SHA256 Digest


這確實解釋了簽名的問題:iText 5.x 不支持RSASSA-PSS。創(chuàng)建 RSA 簽名時,它會自動采用 PKCS1v1.5 填充;特別是在 CMS 簽名容器中,它生成表示簽名算法是 RSASSA-PKCS1-v1_5。因此,任何驗證者都將無法驗證簽名。


顯而易見的選擇是


通過拉皮條或替換 iTextPdfPKCS7類來添加 RSASSA-PSS 支持

或切換到 RSASSA-PKCS1-v1_5 密鑰。


查看完整回答
反對 回復 2023-07-28
  • 1 回答
  • 0 關(guān)注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號