Java電子簽名和電子簽章是目前常用的在線簽名方式。Java程序可以通過(guò)數(shù)字證書實(shí)現(xiàn)對(duì)文檔內(nèi)容的簽名和驗(yàn)證,確保文檔內(nèi)容的完整性和不可更改性,提高數(shù)據(jù)安全性。同時(shí),Java電子簽章可以在文檔中添加簽章圖片,確定簽名人身份和簽署時(shí)間,起到認(rèn)證和授權(quán)的作用。
為了實(shí)現(xiàn)Java電子簽名,需要用到Java Cryptography Extension (JCE) 的相關(guān)類庫(kù)。下面是一個(gè)簡(jiǎn)單示例代碼:
// 加載數(shù)字證書 KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(new FileInputStream("certificate.p12"), "password".toCharArray()); // 獲取數(shù)字證書私鑰和證書鏈 PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", "password".toCharArray()); Certificate[] certChain = keyStore.getCertificateChain("alias"); // 初始化簽名 Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); // 更新原始數(shù)據(jù) byte[] dataBytes = "Hello, world!".getBytes(); signature.update(dataBytes); // 對(duì)原始數(shù)據(jù)進(jìn)行簽名 byte[] signatureBytes = signature.sign();
上面的代碼中,通過(guò)加載數(shù)字證書,獲取私鑰和證書鏈,通過(guò)初始化簽名的方式確定簽名算法和私鑰。之后,對(duì)原始數(shù)據(jù)進(jìn)行更新和簽名,最終輸出簽名數(shù)據(jù)。在驗(yàn)證簽名時(shí),可以通過(guò)簽名數(shù)據(jù)、原始數(shù)據(jù)和簽名證書來(lái)驗(yàn)證簽名是否合法。
電子簽章的實(shí)現(xiàn)方式相對(duì)簡(jiǎn)單,主要是在文檔中添加簽章圖片和簽名人信息。下面是一個(gè)簡(jiǎn)單示例代碼:
// 加載簽章圖片和證書 BufferedImage image = ImageIO.read(new FileInputStream("stamp.png")); KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(new FileInputStream("certificate.p12"), "password".toCharArray()); // 獲取簽章證書和私鑰 Certificate certificate = keyStore.getCertificate("alias"); PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", "password".toCharArray()); // 初始化PdfSigner PdfSigner signer = new PdfSigner(new PdfReader("original.pdf"), new FileOutputStream("signed.pdf"), false); // 設(shè)置簽名信息 PdfSignatureAppearance appearance = signer.getSignatureAppearance(); appearance.setSignatureCreator("Java電子簽名"); appearance.setContact("contact@java.com"); appearance.setLocation("China"); appearance.setReason("Test"); appearance.setCertificationLevel(PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED); appearance.setImage(image); // 簽名 IExternalSignature signature = new PrivateKeySignature(privateKey, "SHA256withRSA"); IExternalDigest digest = new BouncyCastleDigest(); signer.signDetached(digest, signature, new Certificate[]{certificate}, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
在上述代碼中,首先加載簽章圖片和證書,并獲取簽章證書和私鑰。之后,初始化PdfSigner,并設(shè)置簽名信息,其中包括簽名人聯(lián)系方式、簽名地點(diǎn)和簽名原因等。這里設(shè)置了PdfSignatureAppearance.CERTIFIED_NO_CHANGES_ALLOWED,表示簽名后文檔不可更改。最后,通過(guò)私鑰和簽章證書進(jìn)行簽名,并輸出簽名后的文檔。
Java電子簽名和電子簽章的應(yīng)用范圍廣泛,可以用于企業(yè)中的合同簽署、電子發(fā)票、電子證書等方面。在簽署時(shí)需要注意簽署人的身份和簽名安全性,以確保簽名的真實(shí)性和可信度。