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)
————————————————
版权声明:本文为CSDN博主「玄明Hanko」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/citywu123/article/details/111917008
Java实现国密电子签章(itext+bouncycastle +sm3withsm2)相关推荐
- 使用Java对PDF进行电子签章
使用Java对PDF进行电子签章 开始之前 前期准备 开始 生成keystore证书 来张材料全家福 编码 项目结构 签署工具类 开始之前 公司近期做的项目用到了电子签章(给PDF盖章签名),这过程真 ...
- 【Java 代码实例 13】Java操作pdf的工具类itext
目录 一.什么是iText? 二.引入jar 1.项目要使用iText,必须引入jar包 2.输出中文,还要引入下面```itext-asian.jar```包 3.设置pdf文件密码,还要引入下面` ...
- java sm3国密算法加密、验证工具类
java sm3国密算法加密.验证工具类 说明 maven依赖 完整代码 测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出. 工具类也可以直接使用封装 ...
- java操作pdf制作电子签章
#java操作pdf制作电子签章 ##电子签章简介 电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身 ...
- java实现国密算法
java实现国密算法 一.国秘算法SM4 1.1 引入依赖 1.2 使用对称密码算法SM4加解密 二.SM3是哈希算法 2.1 案例 三.SM2算法(公钥私钥是字节类型) 3.1 SM2签名和验签 3 ...
- java主线程捕获子线程中的异常
java主线程捕获子线程中的异常 参考文章: (1)java主线程捕获子线程中的异常 (2)https://www.cnblogs.com/jpfss/p/10272726.html (3)https ...
- java主线程和子线程区别_主线程异常– Java
java主线程和子线程区别 Being a Java Programmer, you must have seen exception in thread main sometimes while r ...
- JAVA毕业设计国漫论坛网站计算机源码+lw文档+系统+调试部署+数据库
JAVA毕业设计国漫论坛网站计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计国漫论坛网站计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...
- Java 天选之子_ 巅峰体验 The Peak Experience
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Java 天选之子_ 巅峰体验 The Peak Experience 站在云端处的巅峰 Stand in the cccccloud ...
- 为何选择iText?java PDF开源库选择与iText发展历史
作者:CuteXiaoKe 微信公众号:CuteXiaoKe 转眼间,我写iText7系列已经有一年多了,还记得最开始的时候是因为兴趣才翻译iText,不过随着慢慢翻译文章才发现iText的强大之处, ...
最新文章
- FreeBSD手册——配置FreeBSD内核
- LeetCode-Remove Duplicates from Sorted Array-从有序数组移除重复-简单逻辑
- ORACLE rac集群概念和原理
- Gartner发布2022年七大安全和风险管理趋势
- 全网首发Oreo易支付开源+教程
- 因“突发肾结石” 孙宇晨宣布取消与巴菲特的午餐会面
- .net链接带密码的ACCESS数据库
- js判断时间是早上还是下午_测血糖别在下午,测空腹血糖早上几点最准确?
- Python检查字符串是否包含另一个字符串
- 服务器主板型号详解,支持Intel Xeon的主板
- Base64编码原理
- Tip - 彻底卸载删除3721(雅虎助手)。快速!
- 当下热门的报表统计系统排行榜
- 图像质量评价(IQA)综述
- 程序员微信名昵称_2020最火的微信名有哪些 好听的微信名字推荐
- 用本地播放器看直播,录制高清视频streamlink的使用
- Python在游戏中的热更新
- 【07】2.3 程序语言介绍
- vue系统权限(动态加载路由方式)
- linux关机命令是什么