Java实现国密电子签章(itext+bouncycastle +sm3withsm2)

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

MakeSignature.signDetached(appearance, digest, pks, 
chain, crlList, ocspClient, tsaClient, estimatedSize, subfilter);

修改MakeSignature类及相关的几个类,核心就是修改PdfPKCS7类。bouncycastle本身就支持
sm2 sm3等国密算法

方案二、

itextpdf+signExternalContainer+bouncycastle

ExternalSignatureContainer external = 
   new HashExternalSignatureContainer(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_DETACHED);
        MakeSignature.signExternalContainer(appearance, external, 8192);

itextpdf已经提供signExternalContainer来让用户自定义签名

当然还有个关键问题就是如何把pkcs7换成国密的数据结构,我们知道国密的数据结构是asn.1编码的,当然pkcs7也是asn.1编码,只不过两者的数据结构体不一样。在java中可以使用bouncycastle来完成签名后的数据序列化成国密要求的数据结构。

step1

先按照《安全电子签章密码技术规范》国密标准生成java对象

@Data
@Builder
public class SESHeader extends ASN1Object {
    //头标识
    private DERIA5String id;
    //印章版本号
    private ASN1Integer version;
    //厂商标识
    private DERIA5String vid;


    @Override
    public ASN1Primitive toASN1Primitive() {
        ASN1EncodableVector vector = new ASN1EncodableVector();
        vector.add(id);
        vector.add(version);
        vector.add(vid);
        return new DERSequence(vector);
    }
}

step2

创建好对象后,就可以序列化成byte[]

byte[] encode = signature.toASN1Primitive().getEncoded();

step3

生成16进制就可以放置在pdf中了

Hex.toHexString(paddedSig)

国密电子签名电子签章是基于《GB/T 38540-2020 安全电子签章规范》开发的技术。它们使用了IText库来完成PDF电子签名,并将签名以PKCS7的格式存储在PDF文件中。对于电子印章的验证,主要流程包括验证电子印章数据格式的正确性、验证电子印章签名值的正确性和验证电子印章制章者证书的有效性以及电子印章的有效期。这些技术和流程的目的是确保电子签名电子签章安全性和可靠性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Java实现国密电子签章(itext+bouncycastle +sm3withsm2)](https://blog.csdn.net/citywu123/article/details/111917008)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [IText国密PDF电子签章,基于《GB/T 38540-2020 安全电子签章规范》开发](https://download.csdn.net/download/qq_41701956/87854378)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [国密电子签章之验签](https://blog.csdn.net/rockycheng/article/details/122346680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈江湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值