**RSA数字签名:**rsa(hash(srcData))->填充pkcs#7格式->存储在pdf中
**SM2数字签名:**sm2(hash(srcData))->填充GB/T 38540格式->存储在pdf中
(在RSA体系中,一般来说第一步RSA对原文hash签名就是我们常说的裸签,裸签通过pkcs#7填充后就是我们pdf所需要的签名格式,其中有个pkcs#1概念就是裸签前对原文进行补位操作后再签名)
)
电子签名、电子签章已经不是个陌生的东西了。在java领域使用itextpdf可以完成pdf的电子签名。当然最终是以pkcs7的格式存储在pdf文件中。类似
)
我们知道pkcs7是RSA体系中的,属于国际标准。我们国家的国密标准也早就出台了,那是否能实现国密的数字签名呢?答案是肯定的可以。
方案一、
itextpdf+修改源代码+bouncycastle
1 | ini复制代码MakeSignature.signDetached(appearance, digest, pks, |
方案二、
itextpdf+signExternalContainer+bouncycastle
1 | ini复制代码ExternalSignatureContainer external = |
当然还有个关键问题就是如何把pkcs7换成国密的数据结构,我们知道国密的数据结构是asn.1编码的,当然pkcs7也是asn.1编码,只不过两者的数据结构体不一样。在java中可以使用bouncycastle来完成签名后的数据序列化成国密要求的数据结构。
step1
先按照《安全电子签章密码技术规范》国密标准生成java对象
)
1 | scala复制代码@Data |
step2
创建好对象后,就可以序列化成byte[]
1 | ini复制代码byte[] encode = signature.toASN1Primitive().getEncoded(); |
step3
生成16进制就可以放置在pdf中了
1 | scss复制代码Hex.toHexString(paddedSig) |
本文转载自: 掘金