Java添加、验证PDF数字签名

合集下载

java 签章流程

java 签章流程

Java签章流程介绍在现代数字化的时代,电子签名已经成为了一种普遍的方式来确认文件的真实性和完整性。

Java提供了丰富的API和工具来实现电子签名功能。

本文将详细介绍Java签章的流程和步骤,以确保流程清晰且实用。

签章流程Java签章的流程可以分为以下几个步骤:1.准备工作:在开始签章之前,需要准备一些必要的工作,包括获取证书、创建密钥库等。

2.加载证书:需要加载用于签章的证书。

证书是由认证机构(CA)颁发的,用于验证签名者身份和确保文件的完整性。

3.创建数字签名:使用私钥对文件进行加密生成数字签名。

私钥是与公钥配对使用的密钥,只有持有私钥的人才能对文件进行数字签名。

4.将数字签名附加到文件:将生成的数字签名附加到原始文件中。

这可以通过在文件中添加特定标记或在文件末尾添加附加信息来完成。

5.验证数字签名:接收者可以使用公钥来验证文件的数字签名是否有效。

公钥是与之前加载的证书相关联的密钥。

下面将详细介绍每个步骤。

准备工作在开始签章之前,需要进行一些准备工作。

1.获取证书:需要获取一个由认证机构颁发的证书。

可以通过向认证机构申请或购买来获得。

2.创建密钥库:密钥库是用于存储私钥和相关证书的安全文件。

可以使用Java提供的keytool工具来创建密钥库。

以下是创建密钥库的示例命令:keytool -genkeypair -alias mykey -keyalg RSA -keystore keystore.jks这将创建一个名为keystore.jks的密钥库,并生成一个RSA算法的密钥对。

3.导出证书:从生成的密钥库中导出公钥证书。

可以使用以下命令导出证书:keytool -exportcert -alias mykey -keystore keystore.jks -file certificate.crt这将从keystore.jks中导出名为certificate.crt的证书文件。

加载证书在准备工作完成后,可以加载用于签章的证书。

PDF怎么添加数字签名?这款编辑器软件很多人都说好用

PDF怎么添加数字签名?这款编辑器软件很多人都说好用

PDF怎么添加数字签名?这款编辑器软件很多人都说好用PDF文件怎么添加数字签名?其实,要给PDF文件添加数字签名,我们可以选择把这份文件转换成PDF格式的文件,再通过PDF编辑器给这份PDF文件添加数字签名。

那么,给PDF文件添加数字签名,我们可以选择哪一款PDF编辑器呢?另外,我们又该如何使用PDF编辑器给PDF文件添加数字签名呢?试试“迅捷PDF编辑器”,这款PDF编辑器软件很多人都说好用。

接下来,我们就以“迅捷PDF编辑器”为例子,往下找寻给PDF文件添加数字签名的具体方法步骤吧。

必备工具:迅捷PDF编辑器获取方法:在电脑百度上输入“迅捷PDF编辑器”并搜索,进入软件官网就可以免费获取第一步:在电脑上下载、安装好“迅捷PDF编辑器”后,双击运行该软件。

打开软件后,点击页面左上方的【文件】-【打开】,在弹出来的框中找到需要添加数字签名的PDF文件。

点击框中的【打开】按钮,把PDF文件打开。

第二步:需要添加数字签名的PDF文件在“迅捷PDF编辑器”中打开后,点击页面上方菜单栏处的【文档】。

在【文档】下拉框中找到【数字签名】,点击其中的【放置签名】以创建新的签名域并签名。

●第三步:点击【放置签名】后,点击并拉动鼠标,创建新的签名域。

●第四步:松开鼠标后,会弹出一个签名文档的设置页面。

在这里,完成对数字签名的各项设置。

完成设置后,点击设置页面的【确定】按钮,如此便完成数字签名的设置啦(或者直接点击【数字签名】中的【签名文档】,完成设置)。

第五步:最后,把已经添加数字签名的PDF文件保存起来就可以啦。

看完小编的分享内容,各位小伙伴是否已经知道如何使用“迅捷PDF编辑器”给PDF文件“迅捷PDF编辑器”还有更多其它PDF编辑功能哦。

添加数字签名了呢?除了添加数字签名,对这款软件感兴趣的小伙伴们,记得到软件官网下载、安装下来哦。

怎么给PDF添加数字签名

怎么给PDF添加数字签名

文件有时候需要签名的时候,上司没在公司的时候又是个急件这个时候我们就需要使用电子档的签名文件,那么如何给PDF文件添加数字签名呢?今天就为大家分享PDF文件的设置签名的方法,想知道的小伙伴们就一起来看看吧!
方法一:迅捷PDF编辑器
1.首先我们需要在电脑中下载一个PDF编辑器,然后在编辑器中打开一个PDF文件。

2.在给PDF文件添加签名之前,需要将文件在迅捷PDF编辑器中打开。

打开文件后,选择菜单栏中的文档选项,在文档选项中找到数字签名工具。

3.数字签名工具后,可以看到数字签名中有签名文档与放置数
字签名,我们先来说说签名文档吧。

4.点击签名文档后,将会弹出一个文件框,在文件框中设置数字签名,然后点击确定,这样数字签名就设置完成了。

5.如果文件中已经有数字签名的话我们就只需要放置数字签
名就可以了,点击放置数字签名。

点击放置数字签名之后,去到文件中需要放置签名的地方进行放置,这样数字签名就完成了。

方法二:PDF在线编辑器
6.还可以在百度中搜索PDF在线编辑器,选择其中的文档处理中的PDF在线编辑。

7.把PDF文件在PDF在线编辑器中打开。

8.打开之后找到右边编辑工具中的签名工具。

然后点击签名工具。

9.在签名框中输入签名的内容,输入完成之后点击确定这样PDF文件的签名就完成了。

10.点击确定之后我们就可以看到文件中的签名就已经设置完成了。

怎么给PDF添加数字签名就跟大家分享完了,有兴趣的小伙伴可以下载上面的编辑器来进行操作哦!。

java 加签方法 -回复

java 加签方法 -回复

java 加签方法-回复Java加签方法,指的是在Java编程中进行数字签名的过程。

数字签名是在互联网通信中保证数据完整性、真实性和不可否认性的重要手段之一。

在网络传输中,数据可能会被篡改、伪造或篡改。

数字签名通过私钥对数据进行加密,然后通过公钥对加密后的数据进行解密和验证,以确保数据的完整性和真实性。

下面,我们将一步一步回答有关Java加签方法的问题。

1. 什么是数字签名?数字签名是将数据进行加密后,用私钥对加密后的数据进行签名,以确保数据在传输过程中的完整性、真实性和不可否认性。

数字签名可以用于验证数据的来源和完整性,防止数据被篡改或伪造。

2. 如何进行数字签名?在Java编程中,可以使用Java提供的密钥对生成器和数字签名算法来进行数字签名。

首先,需要生成一对密钥,包括公钥和私钥。

公钥用于对数据进行加密,私钥用于对加密后的数据进行解密和验证。

然后,使用私钥对数据进行加密并生成数字签名,将数据和数字签名一起传输。

接收方可以使用公钥对收到的数据进行解密和验证,以确保数据的完整性和真实性。

3. 如何在Java中生成密钥对?在Java中,可以使用Java密钥对生成器类(KeyPairGenerator)来生成密钥对。

首先,需要选择一个合适的算法,例如RSA或DSA。

然后,使用密钥对生成器类初始化并生成密钥对。

最后,可以使用公钥和私钥进行数字签名和验证操作。

4. 如何进行数字签名?在Java中,可以使用Java数字签名类(Signature)来进行数字签名。

首先,需要选择一个合适的数字签名算法,例如SHA1withRSA或SHA256withDSA。

然后,使用私钥初始化数字签名对象。

接着,使用update方法更新要签名的数据,可以多次调用update方法传入数据的不同部分。

最后,使用sign方法对数据进行签名,生成数字签名。

5. 如何验证数字签名?在Java中,可以使用Java数字签名类(Signature)来验证数字签名。

如何用Java对PDF文件进行电子签章

如何用Java对PDF文件进行电子签章

如何⽤Java对PDF⽂件进⾏电⼦签章⼀、概述⼆、技术选型三、⽣成⼀个图⽚签章四、如何按模板⽣成PDF⽂件五、如何⽣成PKSC12证书六、如何⽣成⼀个⾼清晰的签章七、如何进⾏多次PDF签名⼋、总结⼀、概述印章是我国特有的历史⽂化产物,古代主要⽤作⾝份凭证和⾏驶职权的⼯具。

它的起源是由于社会⽣活的实际需要。

早在商周时代,印章就已经产⽣。

如今的印章已成为⼀种独特的,融实⽤性和艺术性为⼀体的艺术瑰宝。

传统的印章容易被坏⼈、⼩⼈私刻;从⽽新闻鲜有报道某某私刻公章,侵吞国家财产。

随着计算机技术、加密技术及图像处理技术的发展,出现了电⼦签章。

电⼦签章是电⼦签名的⼀种表现形式,利⽤图像处理技术、数字加密技术将电⼦签名操作转化为与纸质⽂件盖章操作相同的可视效果,同时利⽤电⼦签名技术保障电⼦信息的真实性和完整性以及签名⼈的不可否认性。

电⼦签章与数字证书⼀样是⾝份验证的⼀种⼿段,泛指所有以电⼦形式存在,依附在电⼦⽂件并与其逻辑关联,可⽤以辨识电⼦⽂件签署者⾝份,保证⽂件的完整性,并表⽰签署者同意电⼦⽂件所陈述事实的内容。

⼀般来说对电⼦签章的认定都是从技术⾓度⽽⾔的。

主要是指通过特定的技术⽅案来鉴别当事⼈的⾝份及确保电⼦资料内容不被篡改的安全保障措施。

电⼦签章常于发送安全电⼦邮件、访问安全站点、⽹上招标投标、⽹上签约、安全⽹上公⽂传送、公司合同、电⼦处⽅笺等。

电⼦签章是⼀个很复杂的问题,⼤到有相关的电⼦签章系统;今天分享⼀下如何把电⼦签章应⽤到电⼦处⽅笺的PDF⽂件⾥。

⼆、技术选型⽬前主流处理PDF⽂件两个jar包分别是:1. 开源组织Apache的PDFBox,官⽹2. ⼤名⿍⿍adobe公司的iText,官⽹,其中iText⼜分为iText5和iText7如何在PDFBox、iText5和iText7选出合适⾃⼰项⽬的技术呢?对⽐PDFBox、iText5和iText7这三者:1. PDFBox的功能相对较弱,iText5和iText7的功能⾮常强悍;2. iText5的资料⽹上相对较多,如果出现问题容易找到解决⽅案;PDFBox和iText7的⽹上资料相对较少,如果出现问题不易找到相关解决⽅案;3. 通过阅读PDFBox代码⽬前PDFBox还没提供⾃定义签章的相关接⼝;iText5和iText7提供了处理⾃定义签章的相关实现;4. PDFBox只能实现把签章图⽚加签到PDF⽂件;iText5和iText7除了可以把签章图⽚加签到PDF⽂件,还可以实现直接对签章进⾏绘制,把⽂件绘制到签章上。

Java代码实现文件添加数字签名、验证数字签名

Java代码实现文件添加数字签名、验证数字签名

Java代码实现⽂件添加数字签名、验证数字签名Linux下实现加签、验签1.使⽤OpenSSL ⽣成公钥和密钥;#⽤ OpenSSL, Linux 上⾃带,常⽤命令如下:#⽣成 RSA 私钥(传统格式的)openssl genrsa -out rsa_private_key.pem 1024#将传统格式的私钥转换成 PKCS#8 格式的(JAVA需要使⽤的私钥需要经过PKCS#8编码,PHP程序不需要,可以直接略过)openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt#⽣成 RSA 公钥openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem2.使⽤私钥对⽂件进⾏加签、并验证#有明⽂⽂件file.txt和RSA密钥rsa_private_key.pem#使⽤md5指令指定sha1算法,对file.txt进⾏签名,⽣成签名⽂件sign1.txtopenssl md5 -sha512 -sign rsa_private_key.pem -out data_xinbao.tar.gz.sign data_xinbao.tar.gz#使⽤md5指令指定sha1算法,对file.txt进⾏签名,⽣成签名⽂件sign1.txtopenssl dgst -sha512 -sign rsa_private_key.pem -out data_xinbao.tar.gz.sign data_xinbao.tar.gz#两个签名⽂件⼀样,说明两个指令完成相同的功能diff data_xinbao.tar.gz.sign data_xinbao1.tar.gz.sign#使⽤RSA公钥验证签名(verify参数),验证成功openssl md5 -verify rsa_public_key.pem -sha512 -signature data_xinbao1.tar.gz.sign data_xinbao.tar.gzopenssl dgst -verify rsa_public_key.pem -sha512 -signature data_xinbao.tar.gz.sign data_xinbao.tar.gz3.查看OpenSSL和帮助#通过下⾯命令可以查看openssl的参数说明$ openssl dgst -options are-c to output the digest with separating colons-r to output the digest in coreutils format-d to output debug info-hex output as hex dump-binary output in binary form-sign file sign digest using private key in file-verify file verify a signature using public key in file-prverify file verify a signature using private key in file-keyform arg key file format (PEM or ENGINE)-out filename output to filename rather than stdout-signature file signature to verify-sigopt nm:v signature parameter-hmac key create hashed MAC with key-mac algorithm create MAC (not neccessarily HMAC)-macopt nm:v MAC algorithm parameters or key-engine e use engine e, possibly a hardware device.-md4 to use the md4 message digest algorithm-md5 to use the md5 message digest algorithm-ripemd160 to use the ripemd160 message digest algorithm-sha to use the sha message digest algorithm-sha1 to use the sha1 message digest algorithm-sha224 to use the sha224 message digest algorithm-sha256 to use the sha256 message digest algorithm-sha384 to use the sha384 message digest algorithm-sha512 to use the sha512 message digest algorithm-whirlpool to use the whirlpool message digest algorithm4.拿加签的原⽂件和加签后的⽂件使⽤Java代码进⾏对⽐;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import java.io.*;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Date;/*** 对⽂件加签、验签⼯具类* ⽣成私钥:openssl genrsa -out rsa_private_key.pem 1024* 私钥还不能直接被使⽤,需要进⾏PKCS#8编码:openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt* 根据私钥⽣成公钥:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem* 使⽤私钥sha512签名:openssl dgst -sha512 -sign rsa_private_key.pem -out xx.tar.gz.sign xx.tar.gz* 使⽤公钥sha512验签:openssl dgst -verify rsa_public_key.pem -sha512 -signature xx.tar.gz.sign xx.tar.gz* @author XIHONGLIE* @date 2018-03-27*/public class RsaEncrypt {/*** rsa签名* @param data 待签名的字符串* @param priKey rsa私钥字符串* @return签名结果* @throws Exception 签名失败则抛出异常*/public byte[] rsaSign(byte[] data, RSAPrivateKey priKey)throws SignatureException {try {Signature signature = Signature.getInstance("SHA512withRSA");signature.initSign(priKey);signature.update(data);byte[] signed = signature.sign();return signed;} catch (Exception e) {throw new SignatureException("RSAcontent = " + data+ "; charset = ", e);}}/*** rsa验签* @param data 被签名的内容* @param sign 签名后的结果* @param pubKey rsa公钥* @return验签结果* @throws SignatureException 验签失败,则抛异常*/public boolean verify(byte[] data, byte[] sign, RSAPublicKey pubKey)throws SignatureException {try {Signature signature = Signature.getInstance("SHA512withRSA");signature.initVerify(pubKey);signature.update(data);return signature.verify(sign);} catch (Exception e) {e.printStackTrace();throw new SignatureException("RSA验证签名[content = " + data+ "; charset = " + "; signature = " + sign + "]发⽣异常!", e);}}/*** 私钥*/private RSAPrivateKey privateKey;/*** 公钥*/private RSAPublicKey publicKey;/*** 字节数据转字符串专⽤集合*/private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };/*** 获取私钥* @return当前的私钥对象*/public RSAPrivateKey getPrivateKey() {return privateKey;}/*** 获取公钥* @return当前的公钥对象*/public RSAPublicKey getPublicKey() {return publicKey;}/*** 随机⽣成密钥对*/public void genKeyPair() {KeyPairGenerator keyPairGen = null;try {keyPairGen = KeyPairGenerator.getInstance("RSA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}keyPairGen.initialize(1024, new SecureRandom());KeyPair keyPair = keyPairGen.generateKeyPair();this.privateKey = (RSAPrivateKey) keyPair.getPrivate();this.publicKey = (RSAPublicKey) keyPair.getPublic();}/*** 从.pem⽂件中取得私钥* @param filePath ⽂件路径* @return私钥*/public String getPrivateKeyFromFile(String filePath){String strPrivateKey = "";try {BufferedReader privateKey = new BufferedReader(new FileReader(filePath));String line = "";while((line = privateKey.readLine()) != null){strPrivateKey += line;}privateKey.close();strPrivateKey = strPrivateKey.replace("-----BEGIN PRIVATE KEY-----","").replace("-----END PRIVATE KEY-----",""); }catch (Exception e){e.printStackTrace();}return strPrivateKey;}/*** 从.pem⽂件中取得公钥* @param filePath ⽂件路径* @return公钥*/public String getPublicKeyFromFile(String filePath){String strPublicKey = "";try {BufferedReader publicKey = new BufferedReader(new FileReader(filePath));String line = "";while((line = publicKey.readLine()) != null){strPublicKey += line;}publicKey.close();strPublicKey = strPublicKey.replace("-----BEGIN PUBLIC KEY-----","").replace("-----END PUBLIC KEY-----","");}catch (Exception e){e.printStackTrace();}return strPublicKey;}/*** 从字符串中加载公钥* @param publicKeyStr 公钥数据字符串* @throws Exception 加载公钥时产⽣的异常*/public void loadPublicKey(String publicKeyStr) throws Exception {try {byte[] buffer = Base64Utils.decode(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("RSA");X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);this.publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此算法");} catch (InvalidKeySpecException e) {throw new Exception("公钥⾮法");}catch (NullPointerException e) {throw new Exception("公钥数据为空");}}/*** 加载私钥* @param privateKeyStr 私钥⽂件名* @return是否成功* @throws Exception*/public void loadPrivateKey(String privateKeyStr) throws Exception {try {byte[] buffer = Base64Utils.decode(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer); KeyFactory keyFactory = KeyFactory.getInstance("RSA");this.privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec); } catch (NoSuchAlgorithmException e) {throw new Exception("⽆此算法");} catch (InvalidKeySpecException e) {throw new Exception("私钥⾮法");} catch (NullPointerException e) {throw new Exception("私钥数据为空");}}/*** 加密过程* @param publicKey 公钥* @param plainTextData 明⽂数据* @return* @throws Exception 加密过程中的异常信息*/public byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception {if (publicKey == null) {throw new Exception("加密公钥为空, 请设置");}Cipher cipher = null;try {cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] output = cipher.doFinal(plainTextData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此加密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("加密公钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("明⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("明⽂数据已损坏");}}/*** 解密过程* @param privateKey 私钥* @param cipherData 密⽂数据* @return明⽂* @throws Exception 解密过程中的异常信息*/public byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData)throws Exception {if (privateKey == null) {throw new Exception("解密私钥为空, 请设置");}Cipher cipher = null;try {cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] output = cipher.doFinal(cipherData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此解密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("解密私钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("密⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("密⽂数据已损坏");}}/*** 字节数据转⼗六进制字符串* @param data 输⼊数据* @return⼗六进制内容*/public static String byteArrayToString(byte[] data) {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < data.length; i++) {// 取出字节的⾼四位作为索引得到相应的⼗六进制标识符注意⽆符号右移 stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);// 取出字节的低四位作为索引得到相应的⼗六进制标识符stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);if (i < data.length - 1) {stringBuilder.append(' ');}}return stringBuilder.toString();}/*** btye转换hex函数* @param byteArray* @return*/public static String byteToHex(byte[] byteArray) {StringBuffer strBuff = new StringBuffer();for (int i = 0; i < byteArray.length; i++) {if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {strBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));} else {strBuff.append(Integer.toHexString(0xFF & byteArray[i]));}}return strBuff.toString();}/*** 以字节为单位读取⽂件,常⽤于读⼆进制⽂件,如图⽚、声⾳、影像等⽂件。

pdf电子签名操作规程

pdf电子签名操作规程

pdf电子签名操作规程
《PDF电子签名操作规程》
一、概述
PDF(Portable Document Format)是一种便于分享和打印文档
的格式,广泛应用于各种文件类型的存档和交换。

电子签名是在PDF文档中添加签名以确保文件的真实性和完整性的一种
方式。

本规程旨在规范PDF电子签名的操作流程,以确保签
名的有效性和安全性。

二、适用范围
本规程适用于所有需要进行PDF文件电子签名的部门和人员,包括但不限于合同签订、文件审批、行政审批等场景。

三、操作规程
1. 准备工作
(1)确保使用合法的PDF阅读器和签名工具;
(2)确认所使用的签名工具具备电子签名的法律效力;
(3)安装并使用数字证书以确保签名的真实性和可信度。

2. 签名文件
(1)打开需要签名的PDF文件;
(2)选择“签名”或“加注”功能,并选择合适的签名工具;(3)确认签名位置和方式,进行签名;
3. 验证签名
(1)在签名完成后,确认签名是否生效;
(2)使用数字证书验证签名的真实性和完整性;
4. 保存文件
(1)在签名完成并验证通过后,保存文件并备份。

四、注意事项
1. 保护私钥安全,不得私自泄露;
2. 使用合法和可信的数字证书;
3. 签名文件需保存原始格式,避免对签名文件进行修改。

五、附则
1. 本规程由相关部门负责解释和执行;
2. 对规程内容的变更需提前通知相关人员并重新培训;
3. 违反规程的行为将受到相应的处罚。

以上即为《PDF电子签名操作规程》,希望所有使用PDF电子签名的人员都能遵守规程,并确保签名的有效性和安全性。

java 验签的原理

java 验签的原理

java 验签的原理
在Java中,验签(Verification Signature)是指对数字签名进行验证,以确保传输的数据的完整性和真实性。

数字签名是使用私钥生成的加密摘要,用于验证数据的完整性和发送者的身份。

下面是Java中验签的基本原理:
1.数字签名生成:首先,在数据发送者端,使用私钥对数据
进行加密摘要的生成(签名)操作。

一般来说,使用的加
密算法是非对称加密算法,如RSA。

2.数据传输:接着,将数据和数字签名一起传输给接收者。

数据可以是文件、消息或其他形式的信息。

3.数字签名验证:在数据接收者端,接收到数据和数字签名
后,使用发送者的公钥对数字签名进行验证。

公钥是非对
称加密算法中与私钥对应的,可以用于解密数字签名。

4.验签结果:通过对数字签名的验证,接收者可以得到验签
结果。

如果数字签名验证通过,则表示数据的完整性未被
篡改,并且发送者的身份得到确认。

Java提供了相关的加密库和工具类来支持数字签名的生成和验证,如Java Cryptography Architecture(JCA)和相关的API,如java.security.Signature和java.security.KeyPair等类。

在验签过程中,关键是使用正确的公钥对数字签名进行验证。

公钥需要通过安全信道获得,以确保公钥的真实性和完整性。

此外,还需确保私钥的安全保存,以防止私钥泄露导致签名被
伪造。

java验签方法

java验签方法

java验签方法一、概述Java验签是指对数字签名进行验证的过程,是保证数字签名的真实性、完整性和不可抵赖性的重要手段。

Java提供了许多工具类和方法来实现数字签名的生成和验证,本文将详细介绍Java验签的方法。

二、数字签名数字签名是指用私钥对原始数据进行加密生成的一段数据,用于保证原始数据的真实性、完整性和不可抵赖性。

数字签名包含两部分:原始数据和加密后的数据。

在生成数字签名时,使用私钥对原始数据进行加密得到加密后的数据,并将原始数据和加密后的数据组合成一个字符串作为数字签名。

三、数字证书在进行数字签名时,需要使用到数字证书。

数字证书是一种由权威机构颁发并包含公钥信息以及其他身份信息的电子文档。

在进行数字签名时,需要使用到私钥对原始数据进行加密,而私钥是保存在本地计算机或设备中,并且需要密码保护。

因此,在向外提供服务或者验证身份时,需要使用公钥来验证身份或者验证数字签名。

四、Java验签方法1. 获取公钥首先需要获取公钥信息,在Java中可以通过以下代码获取:KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(new FileInputStream("keystore.jks"), "password".toCharArray());Certificate certificate = keyStore.getCertificate("alias"); PublicKey publicKey = certificate.getPublicKey();其中,JKS是Java Key Store的缩写,是Java中用于存储密钥和证书的一种格式。

keystore.jks是存储公钥和私钥的文件名,alias是存储在keystore中的别名。

2. 验证数字签名获取公钥之后,就可以使用公钥来验证数字签名。

Java 添加、编辑、删除、读取PDF中的书签

Java 添加、编辑、删除、读取PDF中的书签

Java PDF书签——添加、编辑、删除、读取书签概述本文介绍通过Java程序来操作PDF书签,根据对书签的不同操作要求,分以下情况来介绍:1. 添加书签(包括添加一级书签、多级子书签)2. 编辑书签(包括重置书签标题、书签样式等)3. 删除书签(包括删除所有书签、删除子书签等)4. 读取书签工具使用程序使用辅助工具:Free Spire.PDF for Java(免费版),方法1:可下载jar包,解压并将lib文件夹下的jar文件导入java程序(手动导入)方法2:通过创建Maven项目程序,在pom.xml中配置maven仓库路径并指定Free Spire.PDF for Java 的依赖,配置完成后,在IDEA中,点击“Import Changes”导入JAR包:<repositories><repository><id>com.e-iceblue</id><url>/repository/maven-public/</url></repository></repositories><dependencies><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>2.6.3</version></dependency></dependencies>(Ecllipse的导入方法,参考这篇文章)jar导入结果如下图所示:代码示例1. 添加书签到PDFimport com.spire.pdf.*;import com.spire.pdf.actions.PdfGoToAction;import com.spire.pdf.bookmarks.PdfBookmark;import com.spire.pdf.bookmarks.PdfTextStyle;import com.spire.pdf.general.PdfDestination;import com.spire.pdf.graphics.PdfRGBColor;import java.awt.*;import java.awt.geom.Point2D;public class AddBookmark {public static void main(String[] args) {//创建PdfDocument实例PdfDocument pdf = new PdfDocument();//加载PDF文档pdf.loadFromFile("test.pdf");//获取第一页PdfPageBase page = pdf.getPages().get(0);//添加书签PdfBookmark bookmark = pdf.getBookmarks().add("第一部分调查研究概述"); bookmark.setDisplayStyle(PdfTextStyle.Bold);//设置字体样式bookmark.setColor(new PdfRGBColor(new Color(139, 69, 19)));//设置字体颜色PdfDestination destination = new PdfDestination(page, new Point2D.Float(0, 0));//设置书签的目标页面和位置bookmark.setAction(new PdfGoToAction(destination));//添加二级子书签PdfBookmark childBookmark = bookmark.add("第一节菌种特性研究");childBookmark.setColor(new PdfRGBColor(new Color(255, 127, 80)));//设置字体颜色childBookmark.setDisplayStyle(PdfTextStyle.Italic);//设置字体样式PdfDestination childDestination = new PdfDestination(page, new Point2D.Float(0, 100));//设置子书签的目标页面和位置childBookmark.setAction(new PdfGoToAction(childDestination));//添加三级子书签PdfBookmark childBookmark1 = childBookmark.add("1. 菌种特性概念");childBookmark1.setColor(new PdfRGBColor(new Color(125, 152, 100)));//设置字体颜色childBookmark1.setDisplayStyle(PdfTextStyle.Italic);//设置字体样式PdfDestination childDestination1 = new PdfDestination(page, new Point2D.Float(50, 100));//设置子书签的目标页面和位置childBookmark1.setAction(new PdfGoToAction(childDestination1));//保存文档pdf.saveToFile("AddBookmarks.pdf");pdf.dispose();}}2. 编辑PDF中已有的书签import com.spire.pdf.*;import com.spire.pdf.bookmarks.PdfBookmark;import com.spire.pdf.bookmarks.PdfTextStyle;import com.spire.pdf.graphics.PdfRGBColor;import java.awt.*;public class ModifyBookmark {public static void main(String[] args) {//创建PdfDocument实例PdfDocument pdf = new PdfDocument();//加载PDF文档pdf.loadFromFile("AddBookmarks.pdf");//获取第一个书签,修改书签标题、字体颜色、字体样式PdfBookmark bookmark = pdf.getBookmarks().get(0);bookmark.setTitle("新标题");bookmark.setColor(new PdfRGBColor(new Color(255,20,147)));bookmark.setDisplayStyle(PdfTextStyle.Bold);//修改子书签的字体、颜色和字体样式等for (int i = 0 ; i< pdf.getBookmarks().getCount(); i++ ) {//修改二级子书签PdfBookmark childBookmark = bookmark.get(0);childBookmark.setColor(new PdfRGBColor(new Color(148,0,211))); childBookmark.setDisplayStyle(PdfTextStyle.Italic);//修改三级子书签PdfBookmark childBookmark1 = childBookmark.get(0);childBookmark1.setColor(new PdfRGBColor(new Color(255,215,0)) ); childBookmark1.setDisplayStyle(PdfTextStyle.Italic);}//保存文档pdf.saveToFile("ModifyBookmarks.pdf");pdf.close();}}3. 删除PDF中的书签import com.spire.pdf.*;public class DeleteBookmark {public static void main(String[] args) {//创建PdfDocument实例,加载PDF文档PdfDocument pdf = new PdfDocument();pdf.loadFromFile("AddBookmarks.pdf");//删除第一个书签(包括删除其包含的子书签)pdf.getBookmarks().removeAt(0);/*//仅删除子书签PdfBookmark childBookmark = pdf.getBookmarks().get(0); childBookmark.removeAt(0);*///保存文档pdf.saveToFile("RemoveBookmark.pdf");pdf.dispose();}}4. 读取PDF中的书签import com.spire.pdf.*;import com.spire.pdf.bookmarks.PdfBookmark;import com.spire.pdf.bookmarks.PdfBookmarkCollection;import java.io.FileWriter;import java.io.IOException;public class GetBookmark {public static void main(String[] args) {//加载包含书签的PDF文档PdfDocument pdf = new PdfDocument();pdf.loadFromFile("AddBookmarks.pdf");//获取书签集合PdfBookmarkCollection bookmarkCollection = pdf.getBookmarks();//实例化StringBuilder类StringBuilder stringbuilder = new StringBuilder();//定义方法获取书签GetBookmarkTitle(bookmarkCollection, stringbuilder);//声明txt文件,并将获得的多级书签写入到文件.txtFileWriter writer;try {writer = new FileWriter("读取的书签.txt");writer.write(stringbuilder.toString());writer.flush();} catch (IOException e) {e.printStackTrace();}pdf.dispose();}//定义方法获取书签标题static void GetBookmarkTitle(PdfBookmarkCollection bookmarkCollection, StringBuilder stringbuilder){if (bookmarkCollection.getCount()> 0){for(int i = 0 ; i< bookmarkCollection.getCount(); i++ ){PdfBookmark parentBookmark = bookmarkCollection.get(i);stringbuilder.append(parentBookmark.getTitle());//递归文档多级书签GetBookmarkTitle(parentBookmark, stringbuilder);}}}}书签读取结果:。

如何在PDF文档中添加数字签名

如何在PDF文档中添加数字签名

如何在PDF文档中添加数字签名在当今数字化的时代,PDF 文档因其稳定性和兼容性成为了广泛使用的文件格式。

无论是在商务合同、法律文件还是学术论文等领域,我们常常需要对 PDF 文档进行签名以确保其真实性、完整性和不可否认性。

数字签名就是一种有效的手段,它能为 PDF 文档提供更高的安全性和可信度。

那么,如何在 PDF 文档中添加数字签名呢?下面就为您详细介绍。

首先,我们需要了解什么是数字签名。

简单来说,数字签名就像是文件的“指纹”,它是通过特定的算法和加密技术生成的一段独特的代码。

这个代码与签署人的身份信息和文档的内容相关联,能够证明签署人的身份,并保证文档在签名后没有被篡改。

要在 PDF 文档中添加数字签名,我们通常有以下几种方法:方法一:使用 Adobe Acrobat 软件Adobe Acrobat 是一款功能强大的 PDF 编辑软件,它提供了完善的数字签名功能。

步骤 1:打开您需要添加数字签名的 PDF 文档。

步骤 2:在菜单栏中选择“工具”,然后点击“证书”选项。

步骤 3:在弹出的“证书”窗口中,选择“签名文档”。

步骤 4:此时会出现“签名文档”的向导页面,您可以选择“创建新的数字ID”来创建自己的数字证书,或者选择“使用现有的数字ID”来使用已经创建好的数字证书。

步骤 5:如果选择创建新的数字 ID,您需要根据提示输入相关的个人信息,如姓名、电子邮件地址等,并设置密码。

步骤 6:在完成数字证书的创建或选择后,您可以在文档中选择要签名的位置,然后输入密码进行签名。

方法二:使用在线数字签名服务如果您没有安装 Adobe Acrobat 软件,或者觉得其操作较为复杂,还可以选择使用在线数字签名服务。

步骤 1:打开您信任的在线数字签名服务网站,例如 DocuSign 、HelloSign 等。

步骤 2:注册并登录账号。

步骤 3:上传您需要添加数字签名的 PDF 文档。

步骤 4:按照网站的提示设置签名的位置、样式等参数。

Java 获取PDF中的数字签名信息

Java 获取PDF中的数字签名信息

Java 获取PDF中的数字签名信息一、概述及程序环境要求本文以Java代码演示如何获取PDF文档中的数字签名信息,包括签名人、签名位置、日期、原因、联系方式、签名在文档中的坐标等等。

程序环境包括:Spire.Pdf.jar(jar版本:3.11.6)Jdk 1.8.0(版本要求>=1.6.0版本即可)IDEA编辑代码前先导入jar到Java程序,两种导入方法供选择,可按需任选其一即可:1. 下载jar包导入:下载后解压到指定路径,并将lib文件夹下的spire.pdf.jar手动导入Java 程序;2. maven程序中配置pom.xml文件,指定spire的maven路径及依赖,参考如下:<repositories><repository><id>com.e-iceblue</id><url>/repository/maven-public/</url></repository></repositories><dependencies><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf</artifactId><version>3.11.6</version></dependency></dependencies>配置完成后,导入jar到程序。

注:程序环境可不用安装Adobe Acrobat二、Java代码import com.spire.pdf.*;import com.spire.pdf.security.PdfSignature;import com.spire.pdf.widget.PdfFormFieldWidgetCollection;import com.spire.pdf.widget.PdfFormWidget;import com.spire.pdf.widget.PdfSignatureFieldWidget;public class GetSignature {public static void main(String[] args) {//创建PdfDocument实例PdfDocument pdf = new PdfDocument();//加载含有签名的PDF文件pdf.loadFromFile("AddSignature.pdf");//获取域集合PdfFormWidget pdfFormWidget = (PdfFormWidget) pdf.getForm();PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();//遍历域for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i++) { //判定是否为签名域if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {//获取签名域PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);//获取签名PdfSignature signature = signatureFieldWidget.getSignature(); String location = signature.getLocationInfo();String reason = signature.getReason();String data = signature.getDate().toString();String name = signature.getSignatureName();System.out.println("签名位置信息:"+ location +"\n"+"签名原因:" + reason +"\n"+"签名日期:"+ data +"\n"+"签名人:"+ name +"\n"+"文档中的签名坐标:X = "+signatureFieldWidget.getLocation().getX()+ " Y = "+signatureFieldWidget.getLocation().getY());}}}}签名获取结果:。

java验签方法

java验签方法

Java验签方法1. 概述在Java编程中,验签(Signature verification)是一个常见的操作,它用于验证数据的完整性和真实性。

在网络传输中,特别是在涉及到安全性要求较高的场景中,验签是一种重要的技术手段。

本文将介绍Java中的验签方法,包括背景知识、原理、实现步骤和实例演示。

2. 验签的背景与原理在网络传输中,为了保护数据的安全性和完整性,常常使用对称加密或者非对称加密的方式对数据进行加密和解密。

然而,加密只能保证数据在传输过程中不被窃取或篡改,但无法验证发送方的真实身份。

为了解决这个问题,就需要使用验签技术。

验签是使用非对称加密算法来验证数据的真实性和完整性。

它使用了公钥和私钥的配对来进行加密和解密操作。

发送方通过使用私钥对数据进行加密,然后将加密后的数据和使用公钥加密的数字签名一起发送给接收方。

接收方首先使用公钥对数字签名进行解密得到摘要信息,然后将接收到的数据使用相同的算法生成摘要信息,并将两者进行比较。

只有当两者一致时,才能说明数据是真实完整的。

3. 验签的实现步骤Java提供了一套完善的验签工具和API来实现验签的操作。

以下是Java中进行验签的常用步骤:3.1 准备密钥对首先,需要准备一对密钥,包括公钥和私钥。

公钥用于加密数据,私钥用于解密数据。

可以使用Java的KeyPairGenerator类来生成密钥对。

1.使用KeyPairGenerator.getInstance(“RSA”)方法获取密钥对生成器的实例。

2.调用KeyPairGenerator的initialize()方法初始化密钥对生成器,可以指定密钥的大小。

3.调用KeyPairGenerator的generateKeyPair()方法生成密钥对,得到PublicKey和PrivateKey对象。

3.2 加密数据和生成数字签名发送方需要使用私钥对要发送的数据进行加密,并生成数字签名。

Java中提供了Signature类来实现这个功能。

java数字签名(签名生成,用证书验证签名)

java数字签名(签名生成,用证书验证签名)

java数字签名(签名⽣成,⽤证书验证签名)(转载序:⽹上找的好⽂章,⼀篇就把我找了⼏天的所有东西都概括进来了,真是⾮常感谢作者:李素科 其实在找资料的过程当中,主要没解决的问题在于如何获得KeyStore⽂件中的PrivateKey,本来查jsdk 1.4 api⽂档就可以知道了,但是居然从上到下看了2遍,没有发现这个⽅法:load() .......)证书(Certificate,也称public-key certificate)是⽤某种签名算法对某些内容(⽐如公钥)进⾏数字签名后得到的、可以⽤来当成信任关系中介的数字凭证。

证书发⾏机构通过发⾏证书告知证书使⽤者或实体其公钥(public-key)以及其它⼀些辅助信息。

证书在电⼦商务安全交易中有着⼴泛的应⽤,证书发⾏机构也称CA(Certificate Authority)。

应⽤证书证书在公钥加密应⽤中的作⽤是保证公钥在某些可信的机构发布,其在协议SSL、电⼦交易协议SET等⽅⾯有重要的应⽤。

图1显⽰了⼀个最简单的证书应⽤⽅法:图1 证书应⽤⽅法证书的应⽤步骤是:(1) A把⾃⼰的公钥PKA送到CA(Certificate Authority);(2) CA⽤⾃⼰的私钥和A的公钥⽣成A的证书,证书内包括CA的数字签名。

签名对象包括需要在证书中说明的内容,⽐如A的公钥、时间戳、序列号等,为了简化这⾥不妨假设证书中只有三项内容:A的公钥PKA、时间戳TIME1、序列号IDA。

那么CA发送给A的简单证书凭证可表达为:CertA=Eca[TIME1,IDA,PKA];(3) B同样把⾃⼰的公钥PKB送到CA;(4) B得到CA发布的证书CertB;(5) A告知B证书CertA;(6) B告知A证书CertB。

A、B各⾃得到对⽅证书后,利⽤从CA得到的公钥(在CA的⾃签证书中)验证彼此对⽅的证书是否有效,如果有效,那么就得到了彼此的公钥。

利⽤对⽅的公钥,可以加密数据,也可以⽤来验证对⽅的数字签名。

java pdf数字签名 原理

java pdf数字签名 原理

java pdf数字签名原理Java中的PDF数字签名是通过使用Java Cryptography Architecture(JCA)和相关的API来实现的。

数字签名的目的是确保文档的完整性、身份认证和不可否认性。

下面是Java中PDF 数字签名的基本原理:1. 数字签名概述:数字签名使用非对称加密算法,通常涉及到公钥和私钥对。

发送者使用私钥对消息进行签名,接收者可以使用发送者的公钥验证签名。

这确保了签名的唯一性和真实性。

2. PDF数字签名步骤:-选择数字签名算法:Java支持多种数字签名算法,例如RSA、DSA等。

选择一个适当的算法来创建数字签名。

-生成密钥对:通过密钥对生成器生成公钥和私钥。

私钥将用于签名,而公钥将用于验证签名。

-创建数字签名:使用私钥对PDF文档的摘要(消息的哈希值)进行签名。

通常,先计算文档的摘要,然后使用私钥对摘要进行签名。

-将数字签名嵌入PDF文档:将生成的数字签名嵌入PDF文档中。

这通常是通过PDF 文档的数字签名字段完成的。

-验证数字签名:接收者使用发送者的公钥从PDF文档中提取数字签名,并验证签名的有效性。

这通常涉及到计算文档的摘要,然后使用公钥验证签名是否匹配。

3. Java中的实现:在Java中,使用`java.security`包提供的类和接口来实现数字签名。

以下是基本步骤:-使用`KeyPairGenerator`生成密钥对。

-使用`Signature`类创建签名对象,并初始化它以进行签名或验证。

-使用`MessageDigest`类计算文档的摘要。

-使用私钥进行签名,或者使用公钥验证签名。

-将签名嵌入PDF文档。

以下是一个简化的示例代码,演示了如何在Java中进行PDF数字签名:import java.security.*;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Base64;public class PdfSignatureExample {public static void main(String[] args) throws Exception {// 生成密钥对KeyPair keyPair = generateKeyPair();// 读取PDF文档,计算摘要byte[] pdfDocument = readPdfDocument();byte[] digest = calculateDigest(pdfDocument);// 使用私钥进行签名byte[] signature = signData(digest, keyPair.getPrivate());// 将签名嵌入PDF文档embedSignature(pdfDocument, signature);}private static KeyPair generateKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048); // 设置密钥长度return keyPairGenerator.generateKeyPair();}private static byte[] readPdfDocument() {// 读取PDF文档的实现// ...return null;}private static byte[] calculateDigest(byte[] data) throws Exception {MessageDigest digest = MessageDigest.getInstance("SHA-256");return digest.digest(data);}private static byte[] signData(byte[] data, PrivateKey privateKey) throws Exception { Signature signature = Signature.getInstance("SHA256withRSA");signature.initSign(privateKey);signature.update(data);return signature.sign();}private static void embedSignature(byte[] pdfDocument, byte[] signature) { // 将签名嵌入PDF文档的实现// ...}}请注意,这只是一个简单的示例,实际中可能需要处理更多细节和异常。

java针对pdf的方法

java针对pdf的方法

java针对pdf的方法
Java有几种方法可以处理PDF文件:
1. Apache PDFBox:这是一个流行的开源Java库,用于创建、修改和提取PDF文件的内容。

它提供了各种功能,包括合并
和拆分PDF文件、提取文本和图像以及添加注释和水印。

2. iText:这是另一个流行的开源Java库,用于创建和修改
PDF文件。

它可以用于创建新的PDF文件、合并和添加页面、提取文本和图像以及添加注释和水印。

iText还支持数字签名
和加密。

3. PDFRenderer:这是一个开源的Java库,用于将PDF文件
渲染为图像。

它可以将PDF文件转换为JPEG、PNG和TIFF
等格式的图像,以便于显示或进一步处理。

4. PDF Clown:这是一个开源的Java库,用于创建和修改
PDF文件。

它提供了各种功能,包括添加和删除页面、提取
文本和图像以及添加注释和水印。

PDF Clown还支持数字签名、加密和PDF/A格式。

无论选择哪种方法,都可以使用Java来处理PDF文件。

选择
适合你需求的库,然后按照其文档和示例进行操作即可。

Java添加、验证PDF数字签名

Java添加、验证PDF数字签名

Java添加、验证PDF数字签名在设置⽂档内容保护的⽅法中,除了对⽂档加密、添加⽔印外,应⽤数字签名也是⼀种有效防伪⼿段。

数字签名的⽂件⽐较容易验证,并且具有较⾼的权威性和可信度。

在PDF ⽂档中,有可直接添加或验证数字签名的功能⽅法,下⾯的⽂章中,将通过Java程序来介绍添加数字签名到PDF⽂档,以及验证签名是否有效。

使⽤⼯具:Spire.PDF for JavaJar⽂件获取及导⼊⽅法:⽅法1:可通过官⽹⽂件包。

下载后,解压⽂件,并将lib⽂件夹下的Spire.Pdf.jar⽂件导⼊到Java程序。

参考如下导⼊效果:(这⾥程序将jar⽂件分别导⼊了两个module)⽅法2:可通过仓库安装导⼊。

Java代码⽰例【⽰例1】添加数字签名到PDFimport com.spire.pdf.*;import com.spire.pdf.graphics.PdfImage;import com.spire.pdf.graphics.PdfTrueTypeFont;import com.spire.pdf.security.GraphicMode;import com.spire.pdf.security.PdfCertificate;import com.spire.pdf.security.PdfCertificationFlags;import com.spire.pdf.security.PdfSignature;import java.awt.*;import java.awt.geom.Point2D;import java.awt.geom.Rectangle2D;public class AddCertificate {public static void main(String[]args){//加载PDF⽂档PdfDocument doc = new PdfDocument();doc.loadFromFile("test.pdf");//加载pfx证书,及证书秘钥PdfCertificate cert = new PdfCertificate("Cermia.pfx","123654yes!");//添加数字签名到指定页⾯,并设置其位置和⼤⼩PdfSignature signature = new PdfSignature(doc, doc.getPages().get(2), cert, "MySignature");Rectangle2D rect = new Rectangle2D.Float();rect.setFrame(new Point2D.Float((float) doc.getPages().get(0).getActualSize().getWidth() - 340, (float) doc.getPages().get(0).getActualSize().getHeight() - 230), new Dimension(280, 150));signature.setBounds(rect);//设置签名为图⽚加⽂本模式signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);//设置签名的内容signature.setNameLabel("签字者:");signature.setName("Mia");signature.setContactInfoLabel("联系电话:");signature.setContactInfo("028********");signature.setDateLabel("⽇期:");signature.setDate(new java.util.Date());signature.setLocationInfoLabel("地点:");signature.setLocationInfo("成都");signature.setReasonLabel("原因:");signature.setReason("⽂档所有者");signature.setDistinguishedNameLabel("DN: ");signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());signature.setSignImageSource(PdfImage.fromFile("sign.png"));//设置签名的字体signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 9)));//设置⽂档权限为禁⽌更改signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);signature.setCertificated(true);//保存⽂档doc.saveToFile("AddSignature.pdf");doc.close();}}数字签名添加效果:【⽰例2】验证数字签名有效性import com.spire.pdf.*;import com.spire.pdf.security.PdfSignature;import com.spire.pdf.widget.PdfFormFieldWidgetCollection;import com.spire.pdf.widget.PdfFormWidget;import com.spire.pdf.widget.PdfSignatureFieldWidget;import javax.swing.*;public class ValidateSignature {public static void main(String[]args){//创建PdfDocument实例PdfDocument doc = new PdfDocument();//加载含有签名的PDF⽂件doc.loadFromFile("SignnedFile.pdf");//获取域集合PdfFormWidget pdfFormWidget = (PdfFormWidget) doc.getForm();PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();//遍历域for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i++) {//判定是否为签名域if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {//获取签名域PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);//获取签名PdfSignature signature = signatureFieldWidget.getSignature();//判定签名是否有效boolean result = signature.verifySignature();if (result) {String str1 =" 有效签名";JOptionPane.showMessageDialog(null,str1);} else {String str2 =" ⽆效签名";JOptionPane.showMessageDialog(null,str2);}}}}}验证结果:扩展:Java 添加签名域到PDF,可以参考。

Java中如何进行加密和数字签名

Java中如何进行加密和数字签名

Java中如何进行加密和数字签名J2EE及框架 2008-05-06 12:02 阅读10 评论0字号:大中小分类:java_doc本文主要谈一下密码学中的加密和数字签名,以及其在java中如何进行使用。

对密码学有兴趣的伙伴,推荐看Bruce Schneier的著作:Applied Crypotography。

在jdk1.5的发行版本中安全性方面有了很大的改进,也提供了对RSA算法的直接支持,现在我们从实例入手解决问题(本文仅是作为简单介绍):一、密码学上常用的概念1)消息摘要:这是一种与消息认证码结合使用以确保消息完整性的技术。

主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jd k1.5对上面都提供了支持,在java中进行消息摘要很简单,java.security.MessageDigest提供了一个简易的操作方法:/***MessageDigestExample.java*Copyright 2005-2-16*/import java.security.MessageDigest;/***单一的消息摘要算法,不使用密码.可以用来对明文消息(如:密码)隐藏保存*/public class MessageDigestExample{public static void main(String[] args) throws Exception{if(args.length!=1){System.err.println("Usage:java MessageDigestExample text");System.exit(1);}byte[] plainText=args[0].getBytes("UTF8");//使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");System.out.println("\n"+messageDigest.getProvider().getInfo());//开始使用算法messageDigest.update(plainText);System.out.println("\nDigest:");//输出算法运算结果System.out.println(new String(messageDigest.digest(),"UTF8"));}}还可以通过消息认证码来进行加密实现,javax.crypto.Mac提供了一个解决方案,有兴趣者可以参考相关API文档,本文只是简单介绍什么是摘要算法。

PDF数字签名

PDF数字签名

PDF数字签名第一篇:PDF数字签名制做PDF文件电子签名的方法1、在一张白纸上写一个您最得意的签名,并扫描或用数码像机将签名转为图片文件;2、用photoshop打开上面做好的签名图片文件,裁切成刚好能容纳您签名的大小,并去掉图片的背景颜色(方法详见后附),将处理好的图片另存为.GIF 图片格式文件待用;3、打开Adobe Acrobat 9 Pro(本制做方法适用于Adobe Acrobat 9 Pro 版本,其它版本请做相应调整),任意新建一个PDF 文件;4、点击Adobe Acrobat 9 Pro 工具栏中的“签名”—“放置签名”,并用鼠标在新建的那个PDF文件中画一个长方形的签名区(名字相签多大就画多大);5、在随后弹出的窗口中选择“我要立即创建新的数字签名”,并点“下一步”;6、在下一个窗口选择“新建PKCS#12数字身份证文件”,并点“下一步”;7、在弹出的新窗口中输入“姓名”、“部门”,“单位名称”,“电子邮件地址”(以上这些都只能输英文或拼音,不支持汉字);然后选择国家并点“下一步”;8、在接下来弹出的窗口中选择电子签名文件制做好后要存放的文件夹,输入并确认您以后签名时验证身份要用的密码;最后点击“完成”9、在“签名文档”窗口中的“签名为:”档中选择“新建ID”,在“外观(A):”栏选择“创建新外观…”;10、弹出的“配置签名外观”窗口中的标题栏输入这类签名的标识,例:“无日期签名” 等等;在“配置图形”--“显示:”中选择“导入的图形(I)”并点击“文件(F)…”;从“选择图片”窗口的“浏览(B)…”中找到第2步制做好的图片文件并点“确定”返回;这时您就可以“配置签名外观”窗口的“预览”栏中看见您手写的签名了;您也会看到,除了您的签名外,它后面还跟着一些其它信息;这些信息是通过“配置文本”-“显示:”后面的选择项来控制的,您可以根据您的签名需要选择;11、至此,点“确定”后,您的电子签名就算制做完成了,以后在签名时,只需重复第 4步并输入密码就OK了!12、如果需要在签名时同时输入签名“原因”,就需要在“配置签名外观”窗口的“配置文本”选项中勾选上“原因”,点击“确定”完成电子签名制做后,再在“编辑”菜单栏选择“首选项”—“种类”—“安全性”—“高级首选项”—“创建”标签中勾选“签名时显示原因”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档