Java 无符号数据和有符号数据
我必须签名并将数据发送到服务器。我使用Bouncy castle生成了CMSSignedData对象。我对密码学是新手,据我所知,我必须将已签名的数据以及已签名的数据发送到服务器。我必须把它作为一个文件发送。我可以获得使用签名的数据Java 无符号数据和有符号数据,java,digital-signature,Java,Digital Signature,我必须签名并将数据发送到服务器。我使用Bouncy castle生成了CMSSignedData对象。我对密码学是新手,据我所知,我必须将已签名的数据以及已签名的数据发送到服务器。我必须把它作为一个文件发送。我可以获得使用签名的数据 CMSProcessableByteArray cpby = (CMSProcessableByteArray) sigData.getSignedContent() ; byte[] data = (byte[])cpby.getContent(); 这里sig
CMSProcessableByteArray cpby = (CMSProcessableByteArray) sigData.getSignedContent() ;
byte[] data = (byte[])cpby.getContent();
这里sigData是CMSSignedData对象
我想代码
byte[] signed = sigData.getEncoded()
获取字节数组中的有符号数据
问题是创建包含数据和签名数据的文件的一般方法是什么。我是否只添加两字节数组?签名为[]的数组是否也包含数据?如果是,如何从签名为[]的数组中检索数据。我这样问是因为我需要遵循类似的过程来检索数据和签名数据,以便从服务器验证响应。您使用的“签名”类型基于(以前称为“PKCS#7”)。这是一种标准格式,用于用加密或签名或两者封装某些数据;这是递归的,因此可以嵌套多个级别
CMS对象是由这段ASN定义的ContentInfo
结构。1:
当对象描述签名时,contentType
字段包含“已签名数据”的标识符,content
是定义为以下内容的结构:
实际的加密签名位于signerInfos
对象中,而encapContentInfo
可能包含已签名的数据。这是重要的一点。封装的contentinfo
结构是:
请参阅“可选”
”?这意味着CMS对象可能包含也可能不包含已签名的数据
当CMS对象包含已签名的数据时,您将得到一个单个对象,编码为字节数组(这就是使用ASN的要点。1:所有这些对象都可以随意编码和解码)。另一方面,如果CMS对象不包含已签名的数据,则这是分离的签名。当然,如果没有待签名数据的副本,就无法对签名进行验证,因此,如果签名是“分离的”,那么必须有其他方式将数据本身传递给验证者
分离签名在受密码保护的电子邮件中非常流行(S/MIME可以被描述为“电子邮件中的CMS对象”),因为分离签名随后作为电子邮件附加文件发送,电子邮件文本内容保持不变:因此,电子邮件内容仍然可以由软件读取,该软件完全不知道S/MIME可能是什么,并且无法从带有数据对象的CMS中提取数据
在您的情况下,您必须生成验证者完成其工作所需的任何内容。这应该已经在您当前实施的协议中定义好了。协议可能会告诉您,要签名的数据已经通过另一个通道可供验证器使用;或者它可能会告诉您必须使用未分离的CMS签名对象
如果没有明确定义的协议,而您正在按自己的方式制定协议,那么这将导致灾难。我强烈希望情况并非如此。密码学很难使用,主要是因为无法测试您的操作是否正确。您使用的“签名”类型基于(以前称为“PKCS#7”)。这是一种标准格式,用于用加密或签名或两者封装某些数据;这是递归的,因此可以嵌套多个级别
CMS对象是由这段ASN定义的ContentInfo
结构。1:
当对象描述签名时,contentType
字段包含“已签名数据”的标识符,content
是定义为以下内容的结构:
实际的加密签名位于signerInfos
对象中,而encapContentInfo
可能包含已签名的数据。这是重要的一点。封装的contentinfo
结构是:
请参阅“可选”
”?这意味着CMS对象可能包含也可能不包含已签名的数据
当CMS对象包含已签名的数据时,您将得到一个单个对象,编码为字节数组(这就是使用ASN的要点。1:所有这些对象都可以随意编码和解码)。另一方面,如果CMS对象不包含已签名的数据,则这是分离的签名。当然,如果没有待签名数据的副本,就无法对签名进行验证,因此,如果签名是“分离的”,那么必须有其他方式将数据本身传递给验证者
分离签名在受密码保护的电子邮件中非常流行(S/MIME可以被描述为“电子邮件中的CMS对象”),因为分离签名随后作为电子邮件附加文件发送,电子邮件文本内容保持不变:因此,电子邮件内容仍然可以由软件读取,该软件完全不知道S/MIME可能是什么,并且无法从带有数据对象的CMS中提取数据
在您的情况下,您必须生成验证者完成其工作所需的任何内容。这应该已经在您当前实施的协议中定义好了。协议可能会告诉您,要签名的数据已经通过另一个通道可供验证器使用;或者它可能会告诉您必须使用未分离的CMS签名对象
如果没有明确定义的协议,而您正在按自己的方式制定协议,那么这将导致灾难。我强烈希望情况并非如此。密码学很难使用,主要是因为无法测试您是否正确使用了它
ContentInfo ::= SEQUENCE {
contentType ContentType,
content [0] EXPLICIT ANY DEFINED BY contentType }
ContentType ::= OBJECT IDENTIFIER
SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncapsulatedContentInfo,
certificates [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
signerInfos SignerInfos }
EncapsulatedContentInfo ::= SEQUENCE {
eContentType ContentType,
eContent [0] EXPLICIT OCTET STRING OPTIONAL }