【问题标题】:What is being signed by the custom signer?自定义签名者正在签名什么?
【发布时间】:2021-03-23 17:20:46
【问题描述】:

我有以下代码要签名,我遇到的问题是要签名的数据正在通过网络发送,我需要在另一个函数上处理它,但我不确定什么类型的编码或散列有吗?

CMSSignedDataGenerator signGenerator = new CMSSignedDataGenerator();
                X509Certificate userCert = (X509Certificate) this.certificateChain[0];
                ContentSigner mySigner = new CustomSigner(invoke,String.valueOf(userCert.getSerialNumber()),sad);
                signGenerator.addSignerInfoGenerator(
                        new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build())
                                .build(mySigner, userCert));
                signGenerator.addCertificates(new JcaCertStore(Arrays.asList(certificateChain)));
                CMSProcessableInputStream msg = new CMSProcessableInputStream(content);
                CMSSignedData signedData = signGenerator.generate(msg, false);
                return signedData.getEncoded();

充气城堡向签名发送什么内容?它采用什么编码?我在另一边收到以下内容

MYGYMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTIxMDMyMzE3MTA0NVowLQYJKoZIhvcNAQk0MSAwHjANBglghkgBZQMEAgEFAKENBgkqhkiG9w0BAQsFADAvBgkqhkiG9w0BCQQxIgQgpJ/2Sz3j0sp6iqVKmyednqFjZ87SYEYhScT0sSKtHPU=

【问题讨论】:

  • 它是 base64。它解码为一些嵌入了 ASCII 数字的二进制数据。
  • 但是你是否知道它是被签名数据的哈希值还是?
  • 那个 blob 绝对不是 CMS SignedData“分离”签名,这是 Bouncy CMSSignedDataGenerator.generate(,false) 返回的。它看起来像是来自 SignerInfo 的重新构建(使用标记 0x31 而不是 0xa0)SignedAttrs,在签名内部使用,因此也是验证过程

标签: java pdfbox bouncycastle


【解决方案1】:

正如 Jim Garrison 和 dave_thompson_085 在 cmets 中所说,这是一个 base64 编码的签名属性 DER 结构,具有内容类型、签名时间、消息摘要和算法保护属性。这里有一个ASN.1 dump

SET (4 elem)
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.113549.1.9.3 contentType (PKCS #9)
    SET (1 elem)
      OBJECT IDENTIFIER 1.2.840.113549.1.7.1 data (PKCS #7)
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.113549.1.9.5 signingTime (PKCS #9)
    SET (1 elem)
      UTCTime 2021-03-23 17:10:45 UTC
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.113549.1.9.52 cmsAlgorithmProtection (RFC 6211)
    SET (1 elem)
      SEQUENCE (2 elem)
        SEQUENCE (2 elem)
          OBJECT IDENTIFIER 2.16.840.1.101.3.4.2.1 sha-256 (NIST Algorithm)
          NULL
        [1] (2 elem)
          OBJECT IDENTIFIER 1.2.840.113549.1.1.11 sha256WithRSAEncryption (PKCS #1)
          NULL
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.113549.1.9.4 messageDigest (PKCS #9)
    SET (1 elem)
      OCTET STRING (32 byte) A49FF64B3DE3D2CA7A8AA54A9B279D9EA16367CED260462149C4F4B122AD1CF5

根据算法保护属性,BouncyCastle 期望您返回签名此结构的 SHA256withRSA 签名值。

特别是,当您想知道 它有什么类型的编码或散列时,这个结构的散列仍然必须作为签名服务的一部分进行计算。

【讨论】:

  • 谢谢,我正在尝试读取 OCTET STRING,但我被困在如何解析它 ``` private void localTesting(byte[] signatures) throws IOException { ASN1InputStream input = new ASN1InputStream(signatures) ; ASN1Primitive p; while ((p = input.readObject()) != null) { if (p instanceof ASN1Set) { ASN1Sequence asn1 = ASN1Sequence.getInstance(signatures); System.out.println(ASN1Dump.dumpAsString(p)); } } } ```
  • “但我坚持如何解析它” - 你到底想解析它什么?对于签名创建,您只需签署此字节数组并返回签名字节。那么你想验证你得到的结构吗?或者从中检索一些特定信息?
  • 我需要提取消息摘要,因为我需要根据其他函数中计算的哈希值来检查它。据我了解,消息摘要部分是 OCTET STRING
  • 是的,您在上面的示例中看到它是messageDigest 属性的值。
  • 所以 32 字节是正确的(“A49FF64B3DE3D2CA7A8AA54A9B279D9EA16367CED260462149C4F4B122AD1CF5”)?你知道这是否已经是哈希(我知道名称消息摘要是哈希)但它可能还没有被处理
猜你喜欢
  • 2017-10-24
  • 1970-01-01
  • 2022-09-27
  • 2021-03-30
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2011-09-08
  • 2010-10-26
相关资源
最近更新 更多