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包含的 ...
最新文章
- mysql分片库分页查询_mysql数据库分页查询优化
- 注意html的语言编码charset,HTML编码
- ls -l 显示年份
- mybatis学习与踩坑记录
- 特征检测和特征匹配方法汇总
- 【PMP认证考试之个人总结】第 3 章 项目整合管理
- linux如何卸载干净mysql
- Angular测试机床TestBed
- Python+旧衣物捐赠系统 毕业设计-附源码290942
- poi HSSFCellStyle HSSFFont 设置加粗,字体,字号等样式
- css-对号/叉号(纯css)
- Scrapy 爬取今日头条街拍图片
- 太可怕啦!AI 一秒还原马赛克,有码变高清
- constantlayout布局
- 【办公自动化】基于Python开发的PDF批量转换-合并应用程序
- 必记的13个不定积分公式(详细推导)
- 【STM32F407的DSP教程】第3章 Matlab简易使用之基础操作
- 讲讲自己一天入门Python的一些心得
- 知道创宇区块链安全实验室|UmbNetwork 攻击事件分析
- qmail+vpopmail+mysql安装