我有一个签名的 PDF 文件。使用这个使用 iTextSharp 库的函数,我找到了证书 p7m 签名:
private void GetSignature(string FileName)
{
AcroFields acroFields = new PdfReader(FileName).AcroFields;
List<string> names = acroFields.GetSignatureNames();
foreach (var name in names)
{
PdfDictionary dict = acroFields.GetSignatureDictionary(name);
PdfString contents = (PdfString)PdfReader.GetPdfObject(dict.Get(PdfName.CONTENTS));
byte[] PKCS7 = contents.GetOriginalBytes();
ByteArrayToFile(@"c:\signature\" + name + ".p7m", PKCS7);
}
}
Run Code Online (Sandbox Code Playgroud)
现在...如何提取与签名关联的图像(位图)?是否可以?谢谢,路易吉
有谁知道 p7s 文件的内容吗?
文件中至少有一个数字签名,我可以很容易地找到它,但我想捕获文件中包含用私钥加密的部分的部分 - 即数字签名的不可否认部分。
有谁知道在哪里可以找到通用文件格式的简单副本?
编辑补充:
我正在使用的文件的一般格式是:
字节偏移记录类型
0 x509 证书(或者程序是这样说的)
0版本
1 8x(信息类型)
3 1 到下一个信息的偏移量(文件长度 - 4)
52 x509 证书(嵌入式,集合成员: ROOT CA)
56 x509 证书(嵌入式,集合成员: ROOT CA)
(1 个偏移量)x509 证书(新,主题标识符: 电子邮件)
(1 个偏移量 +4)x509 证书(嵌入,收藏成员:电子邮件)
(可变)x509 证书(新的、增强的密钥用法:数字签名、不可否认性)
(变化+4)x509 证书(嵌入,集合成员:数字签名,不可否认))
(可变)x509 cert(新,证书颁发机构信息:CA EMAIL)
(varies+4) x509 证书(嵌入,集合成员:CA EMAIL)
(可变)交叉证书对信息,未知类类型
(可变)未知类类型的证书(如果需要,用尾随零填充)
我确实知道该文件不包含消息摘要,并且不是唯一的,除非它是证书持有者的原始文件(即,不同的证书将产生不同的结果,但不同的消息都附加有相同的 p7s 文件)。
我相信当文件发送到不支持电子邮件加密/解密的系统(例如 gmail 或 yahoo)时,消息摘要会从文件中删除。这就是我对 p7s 文件缺乏明确内容的解释。
除了消息摘要可能已被删除之外,这些文件没有被损坏。它们不会以 ASN.1 格式打开。常规证书文件将以 ASN(cer 文件)打开。
我编写了一个程序,本质上是通过暴力分析文件。 …
我正在做的一个项目有这么多安全操作。我以前从未遇到过安全问题。因此,我的问题可以是初学者级别。
在我的问题中,我得到一个字节数组数据,它有一个证书和一些其他参数。我需要验证此证书及其签名。但我无法处理签名验证。事实上,我不知道我应该使用哪个公钥来验证。
代码如下。感谢帮助..!
public boolean startValidation(PublicKey publicKey) {
CertificateFactory cf;
try {
cf = CertificateFactory.getInstance("X.509");
} catch (CertificateException e) {
e.printStackTrace();
return false;
}
try {
certificate = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certBytes));
} catch (CertificateException e) {
e.printStackTrace();
setCertError(0);
return false;
}
if (!checkProvider()){
setCertError(1);
return false;
}
boolean[] usages = certificate.getKeyUsage();
boolean usage = usages[0] && usages[2];
if (!usage){
setCertError(2);
}
try {
certificate.checkValidity();
} catch (CertificateNotYetValidException e) {
e.printStackTrace();
setCertError(3);
return false;
} catch (CertificateExpiredException e) {
e.printStackTrace();
setCertError(4); …Run Code Online (Sandbox Code Playgroud) 我们正在尝试使用 CAdES 方法和dss-cookbook 中的示例作为使用最新版本 (4.6.RC1) 的起点来签署 PDF 文档。
按照 中的示例SignPdfPadesBDetached.java,我们已成功使用PAdES. 但是,由于没有 的示例CAdES,我们尝试将上面的示例改编为使用CAdES,但它不起作用。具体来说,生成的 PDF 文档的大小仅为 7k 而不是预期的 2.5MB,并且在尝试打开 PDF 时显示以下错误:
我们假设 7k 实际上只是签名,因此不包括实际文档。我们使用的设置是:
而亲戚的方法代码目前是这样的:
public static void signPdfWithCades(DSSDocument toSignDocument) {
LOG.info("Signing PDF with CADES B");
try {
AbstractSignatureTokenConnection signingToken = new Pkcs12SignatureToken("password", KEYSTORE_PATH);
DSSPrivateKeyEntry privateKey = signingToken.getKeys().get(0);
// Preparing parameters for the CAdES signature
CAdESSignatureParameters parameters = new CAdESSignatureParameters();
// We choose the level of the signature (-B, …Run Code Online (Sandbox Code Playgroud) 你好,我在提出这个问题之前搜索了很多。我知道有一个付费选项来签署 pdf setasign.com
我尝试使用php函数:
openssl_pkcs7_sign( FULL_PATH . "/pdforiginal.pdf", //ORIGIANL PDF
FULL_PATH ."signedPDF.pdf", // SIGNED PDF
"file://" . FULL_PATH . "signing_cert.pem",
array( "file://" . FULL_PATH. "private_key.pem",""),array());
Run Code Online (Sandbox Code Playgroud)
signing_cert.pem <- // 我不明白这是什么我只有 private_key 和 public_key。我在这里看到一些人们使用 private_key 的例子。
我的私钥没有密码,我应该使用空白的 "" 还是 null ?
如果有人能给我一些关于这个主题的信息,那将非常有帮助。
我有一个数字签名的 XML 文件和签名者的公共证书,我想验证签名。响应 xml 的原始内容返回 false,但是当我修改 xml 时它返回 true。我的java代码如下:-
import java.io.FileInputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class SignatureVerifierOneFile {
public static void main(String[] args){
Security.addProvider(new BouncyCastleProvider());
//Signed xml path
String signedXmlPath = "C:/signedXML.xml";
SignatureVerifierOneFile signatureVerifier = new SignatureVerifierOneFile();
boolean signatureStatus =
signatureVerifier.verify(signedXmlPath,"C:/Cert.cer");
System.out.println("xml signature validateionis " + signatureStatus);
}
public boolean verify(String signedXml,String publicKeyFile) {
boolean verificationResult = …Run Code Online (Sandbox Code Playgroud) 更新:我已经结束了对这个问题的研究,并发布了一篇冗长的博客文章来解释我的发现:JWT 的不言而喻的漏洞。我解释了使用 JWT 进行本地身份验证的巨大推动如何忽略了一个关键细节:必须保护签名密钥。我还解释说,除非您愿意不遗余力地保护密钥,否则最好通过 Oauth 委托身份验证或使用传统的会话 ID。
我已经看到很多关于 JSON Web 令牌安全性的讨论——重放、撤销、数据透明度、令牌指定的算法、令牌加密、XSS、CSRF——但我没有看到任何对依赖于签名密钥。
如果有人破坏了服务器并获得了 JWT 签名密钥,在我看来,此人此后可以使用该密钥伪造未过期的 JWT 并秘密获得访问权限。当然,服务器可以在每个请求上查找每个 JWT 以确认其有效性,但服务器完全使用 JWT,因此它们不必这样做。服务器可以确认 IP 地址,但如果 JWT 不可信,这也涉及查找,显然这样做会排除可靠的移动访问。
将此与基于会话 ID 的服务器违规进行对比。如果此服务器正在散列密码,则攻击者必须在会话 ID 过期之前分别为每个用户获取并使用会话 ID。如果服务器仅存储会话 ID 的哈希值,则攻击者必须写入服务器以确保访问。无论如何,攻击者似乎没有那么有利。
我发现了一种使用 JWT 的架构而没有这个缺点。反向代理位于外部不受信任的客户端和内部微服务的后端集合之间,由 Nordic API 在此处描述. 客户端从授权服务器获取不透明令牌,并使用该令牌与服务器应用程序通信以处理所有请求。对于每个请求,代理将不透明令牌转换为 JWT 并缓存它们的关联。外部世界从不提供 JWT,限制了因窃取密钥而造成的损害(因为代理会转到身份验证服务器以确认不透明的令牌)。但是,这种方法需要取消引用每个客户端令牌,就像会话 ID 需要针对每个请求取消引用一样,从而消除了 JWT 对客户端请求的好处。在这种情况下,JWT 只允许服务在彼此之间传递用户数据,而不必完全信任彼此——但我仍在尝试理解这种方法的价值。
我的担忧似乎仅适用于不受信任的客户端使用 JWT 作为身份验证令牌。然而,JWT 被许多备受瞩目的 API 使用,包括 Google API。我错过了什么?也许服务器漏洞很少是只读的?有没有办法降低风险?
对于手册页PKCS7_verify()指出
...Each signer's certificate is chain verified using the smimesign purpose...
为什么总是需要这个目的?我理解它,因此签名的 PKCS7 结构可以用于许多事情,S/MIME 只是其中之一。
如果我的签名证书smimeSign在其extendedKeyUsage扩展名中PKCS7_verify()没有,则失败。我需要手动调整purpose以进行验证。我在这里错过了什么吗?
是否可以使用存储在 Azure Key Vault 中的 X509 证书创建 RSA-SHA1 签名?【不可否认证明】
不幸的是,我无法将哈希算法更改为 SHA256 或更安全的算法,而且我确实需要将证书作为密钥存储在 Azure Key Vault 中。
到目前为止我已经尝试过
await kvClient.SignAsync(keyVaultUrl, "RSNULL", digest); // digest = 20byte SHA1
await kvClient.SignAsync(keyVaultUrl, "RSNULL", ans1Digest); // asn1Digest = 35byte SHA1 wrapped in ANS1 structure
Run Code Online (Sandbox Code Playgroud)
签名长度似乎是正确的(256 字节),但验证失败(在正确实现签名验证实现的节点上)。
我还尝试像这样手动实现签名算法(使用keyVault.EncryptAsync):
我一定做错了什么。不确定是否需要所有步骤。
如果微软的任何人读到这个。即使 SHA1 签名不被认为是安全的,你能实现它吗?漂亮,请在上面加糖:-)
所以,现在我正在构建一个供第三方使用的API,我正在阅读有关RS256和HS256的内容.我所理解的是,在第一个中你使用公钥验证和私钥进行签名,而另一个只使用一个密钥..所以如果你使用RS256,因为你想保留你的安全密钥并希望客户端验证令牌,但我不明白为什么要在客户端验证令牌?因为您向服务器发送了一个发布请求,然后它会向您发回一个令牌,每当您想要发出授权请求时,您只需使用该令牌,服务器就会对其进行验证,如果可以,则让您继续.那么,为什么要在客户端验证令牌?我认为这是后端的责任.
我想也许我错了什么,希望你能帮忙解决这个问题.谢谢.
编辑:
所以,我的问题是,我知道RS256和HS256之间的区别,但我不明白它是如何使用它的流程.现在我正在开发第三方api,我只需要在客户端请求它时返回令牌,然后在需要它的请求中,只需从服务器验证它是否是有效令牌.根据我的理解,当您想要从客户端验证令牌时使用RS256,如果这是正确的,有人可以举例说明您何时或为什么要在客户端验证令牌?