当然实际过程没这么简单,还包括,找个合适的第三方再次签名公钥已证明公钥的安全性等。不过只要知道上面的东西基本就可以了。
用Spire.Doc for Java 可以添加及验证数字签名,参考代码:
import 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("02881705109")
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()
}
}
数字签名添加效果:
数字签名效果
参考原文
需要联网或者读取编辑本地文件的java软件、在每次联网或者读取编辑文件的时候都会弹出询问用户是否允许、
这个权限可以设置成“每次询问”、“仅第一次询问”、“始终不允许”、“始终允许”、
没有签名的java软件、是不可以设置为“始终允许”的、
java软件签名版可以设置“始终允许”、避免每次询问的麻烦、
具体例子可见手机QQ下载频道、java版、有“诺基亚用户可下载签名版、获得更佳体验”、谢谢,望采纳。