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)

————————————————
版权声明:本文为CSDN博主「玄明Hanko」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/citywu123/article/details/111917008

Java实现国密电子签章(itext+bouncycastle +sm3withsm2)相关推荐

  1. 使用Java对PDF进行电子签章

    使用Java对PDF进行电子签章 开始之前 前期准备 开始 生成keystore证书 来张材料全家福 编码 项目结构 签署工具类 开始之前 公司近期做的项目用到了电子签章(给PDF盖章签名),这过程真 ...

  2. 【Java 代码实例 13】Java操作pdf的工具类itext

    目录 一.什么是iText? 二.引入jar 1.项目要使用iText,必须引入jar包 2.输出中文,还要引入下面```itext-asian.jar```包 3.设置pdf文件密码,还要引入下面` ...

  3. java sm3国密算法加密、验证工具类

    java sm3国密算法加密.验证工具类 说明 maven依赖 完整代码 测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出. 工具类也可以直接使用封装 ...

  4. java操作pdf制作电子签章

    #java操作pdf制作电子签章 ##电子签章简介 电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身 ...

  5. java实现国密算法

    java实现国密算法 一.国秘算法SM4 1.1 引入依赖 1.2 使用对称密码算法SM4加解密 二.SM3是哈希算法 2.1 案例 三.SM2算法(公钥私钥是字节类型) 3.1 SM2签名和验签 3 ...

  6. java主线程捕获子线程中的异常

    java主线程捕获子线程中的异常 参考文章: (1)java主线程捕获子线程中的异常 (2)https://www.cnblogs.com/jpfss/p/10272726.html (3)https ...

  7. java主线程和子线程区别_主线程异常– Java

    java主线程和子线程区别 Being a Java Programmer, you must have seen exception in thread main sometimes while r ...

  8. JAVA毕业设计国漫论坛网站计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计国漫论坛网站计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计国漫论坛网站计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  9. Java 天选之子_ 巅峰体验 The Peak Experience

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Java 天选之子_ 巅峰体验 The Peak Experience 站在云端处的巅峰 Stand in the cccccloud ...

  10. 为何选择iText?java PDF开源库选择与iText发展历史

    作者:CuteXiaoKe 微信公众号:CuteXiaoKe 转眼间,我写iText7系列已经有一年多了,还记得最开始的时候是因为兴趣才翻译iText,不过随着慢慢翻译文章才发现iText的强大之处, ...

最新文章

  1. FreeBSD手册——配置FreeBSD内核
  2. LeetCode-Remove Duplicates from Sorted Array-从有序数组移除重复-简单逻辑
  3. ORACLE rac集群概念和原理
  4. Gartner发布2022年七大安全和风险管理趋势
  5. 全网首发Oreo易支付开源+教程
  6. 因“突发肾结石” 孙宇晨宣布取消与巴菲特的午餐会面
  7. .net链接带密码的ACCESS数据库
  8. js判断时间是早上还是下午_测血糖别在下午,测空腹血糖早上几点最准确?
  9. Python检查字符串是否包含另一个字符串
  10. 服务器主板型号详解,支持Intel Xeon的主板
  11. Base64编码原理
  12. Tip - 彻底卸载删除3721(雅虎助手)。快速!
  13. 当下热门的报表统计系统排行榜
  14. 图像质量评价(IQA)综述
  15. 程序员微信名昵称_2020最火的微信名有哪些 好听的微信名字推荐
  16. 用本地播放器看直播,录制高清视频streamlink的使用
  17. Python在游戏中的热更新
  18. 【07】2.3 程序语言介绍
  19. vue系统权限(动态加载路由方式)
  20. linux关机命令是什么

热门文章

  1. 【读书笔记】淘宝技术这十年
  2. FPS游戏(UE4,U3D引擎)方框绘制,骨骼透视,BT功能的原理 和反外挂策略
  3. Cisco CCNP课程
  4. 轮询小案例-扫码登录
  5. Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(1):基础知识
  6. Elgamal数字签名原理
  7. 昆腾通过集成新的LTO-8磁带扩大在存储效率领域的领导地位
  8. did拼接屏最小拼缝0.88mm
  9. UI设计中有哪些常见的风格?
  10. 机器学习的13种算法和4种学习方法,推荐给大家