标签: digital-signature

使用 iTextSharp 库提取 pdf 文件中包含的签名图像

我有一个签名的 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)

现在...如何提取与签名关联的图像(位图)?是否可以?谢谢,路易吉

c# pdf itextsharp digital-signature

4
推荐指数
1
解决办法
7577
查看次数

p7s文件的内容

有谁知道 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 文件)打开。


我编写了一个程序,本质上是通过暴力分析文件。 …

digital-signature

4
推荐指数
1
解决办法
1万
查看次数

Java 安全性 - 使用公钥进行 X509 证书验证

我正在做的一个项目有这么多安全操作。我以前从未遇到过安全问题。因此,我的问题可以是初学者级别。

在我的问题中,我得到一个字节数组数据,它有一个证书和一些其他参数。我需要验证此证书及其签名。但我无法处理签名验证。事实上,我不知道我应该使用哪个公钥来验证。

代码如下。感谢帮助..!

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)

java rsa sha256 digital-signature x509certificate

4
推荐指数
1
解决办法
1万
查看次数

无法使用 CAdES 方法签署 PDF,尽管使用 PAdES 签署成功

我们正在尝试使用 CAdES 方法和dss-cookbook 中的示例作为使用最新版本 (4.6.RC1) 的起点来签署 PDF 文档。

按照 中的示例SignPdfPadesBDetached.java,我们已成功使用PAdES. 但是,由于没有 的示例CAdES,我们尝试将上面的示例改编为使用CAdES,但它不起作用。具体来说,生成的 PDF 文档的大小仅为 7k 而不是预期的 2.5MB,并且在尝试打开 PDF 时显示以下错误:
在此处输入图片说明
我们假设 7k 实际上只是签名,因此不包括实际文档。我们使用的设置是:

  • SignatureLevel.CAdES_BASELINE_B
  • SignaturePackaging.DETACHED
  • 摘要算法.SHA256

而亲戚的方法代码目前是这样的:

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)

java pdf digital-signature pdfbox pades

4
推荐指数
1
解决办法
3895
查看次数

带有 PHP 和 Laravel 的数字签名 PDF 文件

你好,我在提出这个问题之前搜索了很多。我知道有一个付费选项来签署 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 ?

如果有人能给我一些关于这个主题的信息,那将非常有帮助。

php pdf openssl digital-signature laravel-5

4
推荐指数
1
解决办法
1万
查看次数

XML签名验证在java中失败

我有一个数字签名的 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)

java xml digital-signature xml-signature

4
推荐指数
1
解决办法
5865
查看次数

对基于 JWT 的服务器的破坏是否更具破坏性?

更新:我已经结束了对这个问题的研究,并发布了一篇冗长的博客文章来解释我的发现: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。我错过了什么?也许服务器漏洞很少是只读的?有没有办法降低风险?

security digital-signature secret-key jwt

4
推荐指数
1
解决办法
1586
查看次数

为什么 OpenSSL 的 PKCS7_verify() 需要“smimesign”证书目的?

对于手册页PKCS7_verify()指出

...Each signer's certificate is chain verified using the smimesign purpose...

为什么总是需要这个目的?我理解它,因此签名的 PKCS7 结构可以用于许多事情,S/MIME 只是其中之一。

如果我的签名证书smimeSign在其extendedKeyUsage扩展名中PKCS7_verify()没有,则失败。我需要手动调整purpose以进行验证。我在这里错过了什么吗?

openssl digital-signature x509 pkcs#7

4
推荐指数
1
解决办法
1021
查看次数

创建 RSA-SHA1 签名

是否可以使用存储在 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摘要
  • 将 SHA1 摘要包装在 ASN.1 结构中(与 SHA1 对象标识符一起)
  • 填充 ANS.1 结构,因此摘要与证书的密钥长度匹配
  • 使用 RSA1_5 >> 签名加密填充的 ANS1.structure

我一定做错了什么。不确定是否需要所有步骤。

如果微软的任何人读到这个。即使 SHA1 签名不被认为是安全的,你能实现它吗?漂亮,请在上面加糖:-)

c# sha1 rsa digital-signature azure-keyvault

4
推荐指数
1
解决办法
3315
查看次数

何时使用RS256进行JWT?

所以,现在我正在构建一个供第三方使用的API,我正在阅读有关RS256和HS256的内容.我所理解的是,在第一个中你使用公钥验证和私钥进行签名,而另一个只使用一个密钥..所以如果你使用RS256,因为你想保留你的安全密钥并希望客户端验证令牌,但我不明白为什么要在客户端验证令牌?因为您向服务器发送了一个发布请求,然后它会向您发回一个令牌,每当您想要发出授权请求时,您只需使用该令牌,服务器就会对其进行验证,如果可以,则让您继续.那么,为什么要在客户端验证令牌?我认为这是后端的责任.

我想也许我错了什么,希望你能帮忙解决这个问题.谢谢.

编辑:

所以,我的问题是,我知道RS256和HS256之间的区别,但我不明白它是如何使用它的流程.现在我正在开发第三方api,我只需要在客户端请求它时返回令牌,然后在需要它的请求中,只需从服务器验证它是否是有效令牌.根据我的理解,当您想要从客户端验证令牌时使用RS256,如果这是正确的,有人可以举例说明您何时或为什么要在客户端验证令牌?

cryptography rsa digital-signature hmac jwt

4
推荐指数
1
解决办法
1412
查看次数