java 时间戳验证_Java中带有时间戳的数字签名
我在使用受信任的时间戳与Bouncy
Castle创建有效的CMS签名时遇到问题。签名创建工作良好(我想将签名包括到PDF文件中),签名有效。但是,当我在签名的未签名属性表中添加可信时间戳后,签名仍然保持有效,但是Reader会报告
该签名包括嵌入式时间戳,但是无效 。这使我相信,哈希时间戳是不正确的,但是我似乎无法弄清楚问题出在哪里。
签名代码:
Store store = new JcaCertStore(Arrays.asList(certContainer.getChain()));
CMSSignedDataGenerator signedDataGenerator = new CMSSignedDataGenerator();
JcaSignerInfoGeneratorBuilder infoGeneratorBuilder = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").build());
JcaContentSignerBuilder contentSignerBuilder = new JcaContentSignerBuilder("SHA1withRSA");
signedDataGenerator.addSignerInfoGenerator(
infoGeneratorBuilder.build(contentSignerBuilder.build(certContainer.getPrivateKey()), (X509Certificate)certContainer.getSignatureCertificate()));
signedDataGenerator.addCertificates(store);
CMSTypedData cmsData = new CMSProcessableByteArray(data);
signedData = signedDataGenerator.generate(cmsData, false);
Collection ss = signedData.getSignerInfos().getSigners();
SignerInformation si = ss.iterator().next(); // get first signer (should be only one)
ASN1EncodableVector timestampVector = new ASN1EncodableVector();
Attribute token = createTSToken(si.getSignature());
timestampVector.add(token);
AttributeTable at = new AttributeTable(timestampVector);
si = SignerInformation.replaceUnsignedAttributes(si, at);
ss.clear();
ss.add(si);
SignerInformationStore newSignerStore = new SignerInformationStore(ss);
CMSSignedData newSignedData = CMSSignedData.replaceSigners(signedData, newSignerStore);
该createTSToken代码:
public Attribute createTSToken(byte[] data) throws NoSuchProviderException, NoSuchAlgorithmException, IOException {
// Generate timestamp
MessageDigest digest = MessageDigest.getInstance("SHA1", "BC");
TimeStampResponse response = timestampData(digest.digest(data));
TimeStampToken timestampToken = response.getTimeStampToken();
// Create timestamp attribute
Attribute a = new Attribute(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken, new DERSet(ASN1Primitive.fromByteArray(timestampToken.getEncoded())));
return a;
}
timestampData:
TimeStampRequestGenerator reqgen = new TimeStampRequestGenerator();
TimeStampRequest req = reqgen.generate(TSPAlgorithms.SHA1, data);
byte request[] = req.getEncoded();
URL url = new URL("http://time.certum.pl");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Content-type", "application/timestamp-query");
con.setRequestProperty("Content-length", String.valueOf(request.length));
OutputStream out = con.getOutputStream();
out.write(request);
out.flush();
if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new IOException("Received HTTP error: " + con.getResponseCode() + " - " + con.getResponseMessage());
}
InputStream in = con.getInputStream();
TimeStampResp resp = TimeStampResp.getInstance(new ASN1InputStream(in).readObject());
response = new TimeStampResponse(resp);
response.validate(req);
if(response.getStatus() != 0) {
System.out.println(response.getStatusString());
return null;
}
return response;
谢谢你的帮助!
示例文件:
java 时间戳验证_Java中带有时间戳的数字签名相关推荐
- java 时间戳 对比_Java中获取时间戳的三种方式对比实现
Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System ...
- java正则表达式验证_Java中的正则表达式电话号码验证
java正则表达式验证 Validating a phone number using regular expression is tricky because the phone number ca ...
- java 时间戳最大值_Java中在时间戳计算的过程中遇到的数据溢出问题解决
背景 今天在跑定时任务的过程中,发现有一个任务在设置数据的查询时间范围异常,出现了开始时间戳比结束时间戳大的奇怪现象,计算时间戳的代码大致如下. package com.lingyejun.authe ...
- xml 数字签名 破解_JAVA中带有数字签名的XML安全性
xml 数字签名 破解 介绍 如您所知,XML在我们的产品或项目开发中起着重要作用,并且从XML文档中我们收集了很多信息,并且我们可以对XML文件执行CRUD操作. 但是,关于如何确保XML文件中可用 ...
- java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信
你说的show是swing里的吧,在老版本中Component这个超类确实有show这个方法,而且这个方法也相当有用,使一个窗口可见,并放到最前面.在jdk5.0中阻止了这个方法,普遍用setVisi ...
- java bean 验证_Java Bean验证基础
java bean 验证 这篇文章总结了一些简单,快速的示例,这些示例说明了您想使用Java Beans Validation API(JSR 349,JSR 303)进行的最常见操作. 记住,Bea ...
- java 序列化实例_Java中的序列化与反序列化实例
创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...
- java 数据类型分为_JAVA中分为基本数据类型及引用数据类型
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...
- java 字符串总结_Java中字符串(String)总结
先说说JDK API: JDK中包含大量的API类库,所谓API(Application Programming Interface,应用程序编程接口,这些功能以类的形式封装). JDK API包含的 ...
最新文章
- Unity三维游戏开发C#编程大师班 Masterclass In C# Programing Unity 3D Game Development FPS
- ASP.NET ViewState 初探
- android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法
- STL vector的几种清空容器(删除)办法
- 让窗体获得焦点,一定会有您用到的时候
- ubuntu mysql 初始化_Ubuntu初始化MySQL碰到的坑
- 手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b
- 执行DBMS_METADATA.get_ddl报ORA-39212的解决方法
- AutoPostBack
- sha1 java 代码_HMAC-SHA1的java源代码实现
- Windows系统、下的MySQL、版本升级、实操
- 视频教程-学透JavaScript-JavaScript
- 数据库基础学习-计划内容 For 小样儿
- Spring Boot 大文件上传(断点上传)、服务端分片下载、客户端分片下载(断点下载)
- 计算机方向 会议级别
- iOS 图片 绘制梯形 背景图屠屏
- angular 自定义打包文件名
- YuKimCai——Linux(centos操作系统)挂盘记录
- 蓝桥杯第12届第三次模拟
- 未来科技 从零到一「真格星球 · 前沿科技创业营」探访加速科技