- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试验证 pdf 文件中的签名。他们一共有三个。我已经用我在互联网上找到的代码签署了该文件并根据我的需要采用了,所以它也可能是正确的。这是签名文件 pdf file
validator 代码在这里:
package com.mycompany.verifysignature;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.bouncycastle.crypto.digests.GOST3411Digest;
import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.CAdESType;
public class Main {
public static void main(String args[]) {
try {
ArrayList<Map<String, String>> resList = new ArrayList<Map<String, String>>();
InputStream pdfIs = new FileInputStream("/home/user1/Desktop/321-17.pdf");
com.itextpdf.text.pdf.PdfReader reader = new com.itextpdf.text.pdf.PdfReader(pdfIs);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
com.itextpdf.text.pdf.PdfStamper stamper = com.itextpdf.text.pdf.PdfStamper.createSignature(reader, baos, '\0');
com.itextpdf.text.pdf.PdfSignatureAppearance sap = stamper.getSignatureAppearance();
com.itextpdf.text.pdf.AcroFields fields = reader.getAcroFields();
for (String signame : fields.getSignatureNames()) {
HashMap<String, String> m = new HashMap();
m.put("name", signame.toString());
System.out.println("name:"+signame);
com.itextpdf.text.pdf.PdfDictionary sig = fields.getSignatureDictionary(signame);
if (sig != null && sig.getAsString(com.itextpdf.text.pdf.PdfName.REASON) != null) {
m.put("reason", sig.getAsString(com.itextpdf.text.pdf.PdfName.REASON).toString()
.replaceAll("\"", "\\\""));
System.out.println("reason:"+sig.getAsString(com.itextpdf.text.pdf.PdfName.REASON).toString()
.replaceAll("\"", "\\\""));
} else {
m.put("reason", "undefined");
System.out.println("reason:undefined");
}
byte signature[] = null;
if (sig != null && sig.getBytes() != null) {
signature = sig.getBytes();
}
byte hash[] = calcHash(sap.getRangeStream());
if (hash != null) {
CAdESSignature cadesSignature = new CAdESSignature(signature, hash, CAdESType.CAdES_X_Long_Type_1);
try {
cadesSignature.verify(null);
m.put("valid", "true");
System.out.println("valid:true");
} catch(Exception ex) {
m.put("valid", "false");
System.out.println("valid:false");
}
} else {
m.put("valid", "\"undefined\"");
System.out.println("valid:undefined");
}
// com.itextpdf.text.pdf.security.PdfPKCS7 pk = fields.verifySignature(signame);
//
// m.put("valid", new Boolean(pk.verify()).toString());
// System.out.println("valid:"+new Boolean(pk.verify()).toString());
resList.add(m);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static byte[] calcHash(InputStream is) {
if (is == null) return null;
try {
GOST3411Digest digest = new GOST3411Digest();
byte node[] = readBytesFromStream(is);
digest.update(node, 0, node.length);
byte[] resBuf = new byte[digest.getDigestSize()];
digest.doFinal(resBuf, 0);
return resBuf;
} catch (Throwable e) {
e.printStackTrace();
//throw new Exception(e);
}
return null;
}
private static byte[] readBytesFromStream(InputStream is) throws Exception {
ArrayList<Object[]> c = new ArrayList();
int n, size = 0;
byte b[] = null;
if (is == null) throw new Exception("input stream is null");
try {
while ((n = is.read(b = new byte[1024])) > 0) {
c.add(new Object[] { n, b });
size += n;
}
} catch (IOException e) {
e.printStackTrace();
}
byte rv[] = new byte[size];
int pos = 0;
for (Object[] bb : c) {
for (int i = 0; i < (Integer) bb[0]; i++) {
rv[pos++] = ((byte[]) bb[1])[i];
}
}
return rv;
}
}
我已经签署了使用 GOST3411 制作的文件摘要,并带有在 cryptopro 网站上生成的测试证书。
当我用pdf阅读器打开这个文件时,它说有3个签名。我真的签了三遍了。但是上面的代码从pdf签名中取出的名称与我写的名称不相等。它们看起来像 Signature1、Signature2 等。这三种情况都应该写成“CN”。请帮忙。我做错了什么?
最佳答案
OP 提供的文件 321-174.pdf 仅使用一个签名进行签名,而不是三个签名,主要错误是签名字典内容的 Contents 是 不是 CMS 签名,而是文本内容,可能是 base64 编码的。因此,代码中的一些解码似乎是必要的。
话虽如此,我在规范 ISO 32000-1 的表 257 - SubFilter 值算法支持 中找不到 GOST3410 - 因此它在这种情况下的使用很可能不会被接受。
关于java - 无法验证 pdf 签名。 itext、pdf、GOST3410,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25362553/
我正在尝试使用 OpenSSL 1.0.0d 实现 ECDH key 交换 GOST 34.10-2001。我正在像这样加载 gost 引擎: ENGINE * e = ENGINE_by_i
我想使用 OpenSSL 生成私有(private)/公共(public)/(证书签名请求)并稍后签署一些数据。但我想用OpenSSL GOST engine . 我下载了 OpenSSL 1.0.0
如果有办法以编程方式将自定义参数插入 GOST 2001 参数集,应该使用什么 API?通过模拟 OpenSSL 的功能设法生成 EVP_PKEY 后,我发现参数绑定(bind)到 NID,因此需要在
我对静态链接的 openSSL 库和 GOST 加密引擎有疑问。 我有使用 GOST key 和证书的简单客户端/服务器应用程序。 它适用于 GOST key ,但前提是我使用 openSSL 库的动
我正在尝试安装SoftHSM如图here ,这需要 OpenSSL。所以我安装了OpenSSL v1.0.2j,但它似乎没有捆绑GOST支持,或者至少我在/usr/lib/openssl/中找不到li
我想在我的客户端密码列表中使用 GOST 密码的同时使用 Java 客户端与某些 Web 服务器建立 SSL 连接。我尝试使用 getEnabledCipherSuites() 和 getSuppor
我正在尝试使用 C 手动编写 GOST 哈希函数。我发现了 Markku-Juhani Saarinen(来自 link)的以下代码。 /* * gosthash.c * 21 Apr 199
我有我的证书、源文档、Base64 格式的分离签名。由 UEC(通用电子卡 - 俄罗斯智能卡项目)在 Windows 上的 CryptoARM 程序中创建的签名(我认为 GOST hash funct
我试图强制 python 2.7 使用修改后的 openssl 库。我需要支持俄罗斯 GOST 密码。所以我像这样配置 OpenSSL ./config shared zlib enable-rfc3
美好的一天!我正在尝试根据来自客户端的 post 请求的十六进制字符串创建公钥 ObjectHandle。 我正在根据文档进行操作,但它返回给我 CKR_ATTRIBUTE_TYPE_INVALID
目前我需要为 GOST 34.10-2001 签名算法生成一个 key 对。很高兴发现充气城堡提供商支持此算法,但我无法生成 key 对并将其保存到任何类型的任何 keystore 。目前我尝试了这个
我正在尝试实现 gost 28147-89 算法来加密和解密字符串。 在 bouncycaSTLe 文档中,我不明白如何实现 gost 28147。如何制作一个使用 gost 28147-89 算法加
我是一名优秀的程序员,十分优秀!