0

我必须签名并将数据发送到服务器。使用 Bouncy castle 我生成了 CMSSignedData 对象。我是密码学的新手,据我了解,我必须将已签名的数据以及已签名的数据发送到服务器。我必须将其作为单个文件发送。我可以获取使用签名的数据

CMSProcessableByteArray cpby = (CMSProcessableByteArray) sigData.getSignedContent() ;
byte[] data = (byte[])cpby.getContent();

这里 sigData 是 CMSSignedData 对象

我认为代码

byte[] signed = sigData.getEncoded() 

让我得到字节数组中的签名数据。

问题是创建包含数据和签名数据的文件的一般方法是什么。我只是添加两个字节数组吗?数组 signed[] 是否也包含数据?如果是这样,我如何从数组 signed[] 中检索数据。我之所以这样问,是因为我需要遵循类似的程序来检索数据和签名数据,以验证来自服务器的响应的验证过程。

4

2 回答 2

3

您使用的“签名”类型基于CMS(以前称为“PKCS#7”)。这是一种标准格式,用于使用加密或签名或两者来封装一些数据;这是递归的,因此您可以嵌套多个级别。

CMS 对象是ContentInfo由这段 ASN.1 定义的结构:

  ContentInfo ::= SEQUENCE {
    contentType ContentType,
    content [0] EXPLICIT ANY DEFINED BY contentType }
       
  ContentType ::= OBJECT IDENTIFIER

当对象描述一个签名时,该contentType字段包含“签名数据”的标识符,并且content是一个SignedData定义为的结构:

  SignedData ::= SEQUENCE {
    version CMSVersion,
    digestAlgorithms DigestAlgorithmIdentifiers,
    encapContentInfo EncapsulatedContentInfo,
    certificates [0] IMPLICIT CertificateSet OPTIONAL,
    crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
    signerInfos SignerInfos }

实际的加密签名在signerInfos对象中,同时encapContentInfo 可能包含已签名的数据。这是重要的一点。EncapsulatedContentInfo结构是:

  EncapsulatedContentInfo ::= SEQUENCE {
    eContentType ContentType,
    eContent [0] EXPLICIT OCTET STRING OPTIONAL }

看到“ OPTIONAL”了吗?这意味着 CMS 对象可能包含也可能不包含已签名的数据。

当 CMS 对象包含已签名的数据时,您最终会得到一个object,编码为字节数组(这就是使用 ASN.1 的要点:所有这些对象都可以随意编码和解码)。另一方面,如果 CMS 对象不包含已签名的数据,则这是一个分离的签名。当然,如果没有要签名的数据的副本,就无法对签名进行验证,因此如果签名是“分离的”,则必须有其他方式将数据本身传递给验证者。

分离式签名在使用S/MIME(S/MIME 可以描述为“电子邮件中的 CMS 对象”)的加密保护电子邮件的上下文中很流行,因为分离式签名随后作为电子邮件附件发送,而电子邮件文本内容保持不变:因此,电子邮件的内容仍然可以被完全不知道 S/MIME 可能是什么的软件读取,并且无法从 CMS-with-data 对象中提取数据。

在您的情况下,您必须生成验证者完成其工作所需的任何内容。这应该已经在您当前正在实施的协议中定义。可能,协议可能会告诉您要签名的数据已经通过另一个渠道提供给验证者;或者它可能会告诉您必须使用非分离的 CMS 签名对象。

如果没有明确定义的协议,而你正在制定它,那么这就是灾难的根源。我强烈希望不是这样。密码学很难使用,主要是因为没有办法测试你是否正确地使用了它。

于 2013-08-08T14:24:17.230 回答
0

首先,您需要知道服务器期望以什么格式发送数据。如果你使用 PKCS#7/CMS,那么你不需要合并任何东西。

PKCS#7 支持包装和分离签名。在第一种情况下,您在一个块中获得签名数据和签名,然后将该块发送到服务器。如果您创建一个分离的签名,那么您将拥有原始数据和一个单独的小签名块。

当原始数据必须保持可读时,通常会使用分离签名(因为包装数据会使目标读者无法读取,例如,如果您使用 PKCS#7 对 PDF 文件进行签名,Acrobat 将无法正确打开它) . 所以我认为你应该在一个块中发送签名数据。

于 2013-08-08T18:04:36.663 回答