日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PDF时间戳数字签名

發(fā)布時間:2024/3/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PDF时间戳数字签名 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

可信時間戳是由時間戳服務(wù)中心(TSA:Time Stamp Authority)頒發(fā)的具有法律效力的電子憑證, 時間戳與電子數(shù)據(jù)唯一對應(yīng),其中包含電子數(shù)據(jù) “指紋”、產(chǎn)生時間、時間戳服務(wù)中心信息等。

可信時間戳的法律效力、作用我就不說了 直接貼代碼吧。

import com.itextpdf.text.DocumentException; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*;import java.io.*; import java.security.MessageDigest; import java.security.SignatureException; import java.security.cert.CertificateParsingException; import java.security.cert.X509Certificate; import java.util.Calendar; import java.util.HashMap;/*** Created by zhangzhenhua on 2016/11/1.*/ public class PDFSigner {//tsaprivate SignerKeystore signerKeystore;private TSAClient tsaClient;private PDFSigner(){}/**** @param tsa_url tsa服務(wù)器地址* @param tsa_accnt tsa賬戶號* @param tsa_passw tsa密碼* @param cert_path 證書路徑* @param cert_passw 證書密碼*/public PDFSigner(String tsa_url,String tsa_accnt,String tsa_passw,String cert_path,String cert_passw) {tsaClient = new TSAClientBouncyCastle(tsa_url, tsa_accnt, tsa_passw);try {signerKeystore = new SignerKeystorePKCS12(new FileInputStream(cert_path), cert_passw);} catch (Exception e) {e.printStackTrace();}}/*** TSA時間戳簽名* @param infilePath 未簽名的文件路徑* @param outfilePath 簽名后的文件路徑* @throws Exception*/public void signPDF(String infilePath,String outfilePath) throws Exception {PdfReader reader = new PdfReader(infilePath);FileOutputStream fout = new FileOutputStream(outfilePath);PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');PdfSignatureAppearance sap = stp.getSignatureAppearance();sap.setCrypto(null, this.signerKeystore.getChain(), null, PdfSignatureAppearance.SELF_SIGNED);sap.setVisibleSignature(new Rectangle(100, 100, 300, 200), 1, "Signature");PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, new PdfName("adbe.pkcs7.detached"));dic.setReason(sap.getReason());dic.setLocation(sap.getLocation());dic.setContact(sap.getContact());dic.setDate(new PdfDate(sap.getSignDate()));sap.setCryptoDictionary(dic);int contentEstimated = 15000;HashMap exc = new HashMap();exc.put(PdfName.CONTENTS, new Integer(contentEstimated * 2 + 2));sap.preClose(exc);PdfPKCS7 sgn = new PdfPKCS7(this.signerKeystore.getPrivateKey(), this.signerKeystore.getChain(), null, "SHA1", null, false);InputStream data = sap.getRangeStream();MessageDigest messageDigest = MessageDigest.getInstance("SHA1");byte buf[] = new byte[8192];int n;while ((n = data.read(buf)) > 0) {messageDigest.update(buf, 0, n);}byte hash[] = messageDigest.digest();Calendar cal = Calendar.getInstance();byte[] ocsp = null;if ( this.signerKeystore.getChain().length >= 2) {String url = PdfPKCS7.getOCSPURL((X509Certificate) this.signerKeystore.getChain()[0]);if (url != null && url.length() > 0)ocsp = new OcspClientBouncyCastle((X509Certificate) this.signerKeystore.getChain()[0], (X509Certificate) this.signerKeystore.getChain()[1], url).getEncoded();}byte sh[] = sgn.getAuthenticatedAttributeBytes(hash, cal, ocsp);sgn.update(sh, 0, sh.length);byte[] encodedSig = sgn.getEncodedPKCS7(hash, cal, this.tsaClient, ocsp);if (contentEstimated + 2 < encodedSig.length)throw new Exception("Not enough space");byte[] paddedSig = new byte[contentEstimated];System.arraycopy(encodedSig, 0, paddedSig, 0, encodedSig.length);PdfDictionary dic2 = new PdfDictionary();dic2.put(PdfName.CONTENTS, new PdfString(paddedSig).setHexWriting(true));sap.close(dic2);}public static void main(String[] args) {//testString TSA_URL = "http://tsa.safelayer.com:8093";String TSA_ACCNT = "";String TSA_PASSW = "";String IN_FILE = "E:\\項目\\paperless\\lipsum.pdf";String OUT_FILE = "E:\\項目\\paperless\\test_signed.pdf";String CERT_PATH = "E:\\項目\\paperless\\bfnsh.pfx";String CERT_PASSW = "123456";PDFSigner signer = new PDFSigner(TSA_URL,TSA_ACCNT,TSA_PASSW,CERT_PATH,CERT_PASSW);try {signer.signPDF(IN_FILE,OUT_FILE);} catch (Exception e) {e.printStackTrace();}}} 以上是簽名類,再貼一下輔助讀取證書的類 import java.security.PrivateKey; import java.security.Provider; import java.security.cert.Certificate;/*** Created by zhangzhenhua on 2016/10/28.*/ public interface SignerKeystore {public PrivateKey getPrivateKey() ;public Certificate[] getChain() ;public Provider getProvider();} /*** Created by hmt on 2016/10/28.*/import java.io.InputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.Provider; import java.security.Security; import java.security.cert.Certificate;/*** SignerKeystore implementation using PKCS#12 file (.pfx etc)*/public class SignerKeystorePKCS12 implements SignerKeystore {private static Provider prov = null;private KeyStore ks;private String alias;private String pwd;private PrivateKey key;private Certificate[] chain;public SignerKeystorePKCS12(InputStream inp, String passw) throws Exception {// This should be done once only for the provider...if (prov == null) {prov = new org.bouncycastle.jce.provider.BouncyCastleProvider();Security.addProvider(prov);}this.ks = KeyStore.getInstance("pkcs12", prov);this.pwd = passw;this.ks.load(inp, pwd.toCharArray());this.alias = (String)ks.aliases().nextElement();this.key = (PrivateKey)ks.getKey(alias, pwd.toCharArray());this.chain = ks.getCertificateChain(alias);}public PrivateKey getPrivateKey() {return key;}public Certificate[] getChain() {return chain;}public Provider getProvider() {return ks.getProvider();}}

測試結(jié)果

總結(jié)

以上是生活随笔為你收集整理的PDF时间戳数字签名的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩激情在线视频 | 福利姬在线观看 | 二区久久 | 国产91边播边对白在线 | 免费人成在线观看 | 一区二区三区四区免费视频 | www.69av.com | 综合 欧美 亚洲日本 | 久久婷婷影视 | 精品人妻在线一区二区三区 | 青少年xxxxx性开放hg | www五月天com | 播金莲一级淫片aaaaaaa | 啪啪小视频网站 | 毛片在哪看 | 日女人免费视频 | 日韩三级网 | 久久伊人99 | 国产嫩草视频 | 夜夜躁很很躁日日躁麻豆 | 国产成人精品免费视频 | 日本午夜大片 | 五月婷婷欧美 | 亚洲国产麻豆 | 99热影院 | 亚洲精品久久久中文字幕 | 国产愉拍| 精品久久久中文字幕 | 日韩激情在线观看 | 琪琪久久 | 欧美精品第一页 | 国产特级视频 | 欧美激情国产一区 | 亚洲午夜精品久久久久久人妖 | 亚洲av无码电影在线播放 | 亚洲精品97 | 一本视频 | 亚洲av无码专区在线播放中文 | 欧美一区二区高清视频 | 黄色裸体网站 | 懂色av一区| 精品久久久久久久久久岛国gif | 亚洲网站在线免费观看 | 新天堂在线 | 久久免费少妇高潮久久精品99 | 婷婷色在线 | 成人精品久久久午夜福利 | 黄色av网站免费观看 | 精品人妻一区二区三区蜜桃视频 | 捆绑调教sm束缚网站 | 亚洲精品第一 | 男人都懂的网站 | 国产夫妻在线视频 | 色哟哟一区二区三区 | av中字在线 | 97无码精品人妻 | 欧美一区二区三区免 | 无码国产精品一区二区免费16 | 久久久久久免费毛片精品 | 猛男大粗猛爽h男人味 | 日韩在线视频不卡 | 欧美三级午夜理伦三级小说 | 亚洲精品国产91 | 国产美女免费网站 | 亚洲成人日韩在线 | 欧美婷婷 | 国产精品自拍合集 | а√天堂中文在线资源8 | 久久亚洲中文字幕无码 | 9l视频自拍九色9l视频成人 | 久久视频免费看 | 国产黄色大片 | 中文字幕一区二区三区人妻 | 色哟哟国产精品 | 国产视频h| 色网址在线 | 欧美一区二区三区激情啪啪 | 人人av在线 | 国产精品永久免费视频 | 理想之城连续剧40集免费播放 | 黄色麻豆视频 | 一区二区三区欧美视频 | h片免费观看 | 欧美成人三级在线 | 国产一区二区视频在线免费观看 | 91精品婷婷国产综合久久 | 欧美午夜激情影院 | 另类亚洲色图 | 欧美一区二区三区影视 | 大桥未久av在线播放 | 久久夜色精品国产噜噜亚洲av | h欧美| 欧美黄色免费 | 欧美国产三级 | 久月婷婷 | 免费福利在线视频 | av久热| 亚洲a影院 | 久久av无码精品人妻系列试探 |