2013-08-08 8 views
0

Мне нужно подписать и отправить данные на сервер. Используя замок Bouncy, я создал объект CMSSignedData. Я новичок в криптографии, и насколько я понимаю, я должен отправить подписанные данные, а также подписанные данные на сервер. И я должен отправить это как один файл. Я могу получить данные, который был подписан с использованиемНеподписанные данные и подписанные данные

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

Здесь sigData является объектом CMSSignedData

Я полагаю, что код

byte[] signed = sigData.getEncoded() 

получает меня подписанные данные в виде массива байтов.

Вопрос в том, что является общим методом для создания файла, содержащего данные и подписанные данные. Я просто добавляю два байтовых массива? Имеет ли массив подписан [] также данные? Если да, то как мне получить данные из массива, подписанного []. Я спрашиваю об этом, потому что мне нужно будет выполнить аналогичную процедуру для извлечения данных и подписанных данных для процесса проверки ответа с сервера.

ответ

2

Тип "подпись", которую вы используете, основан на 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 содержит данные, подписанные, то вы в конечном итоге с одного объектом, закодированным в виде массива байт (это точка с помощью ASN.1: все эти объекты могут быть закодированы и декодируются по желанию). С другой стороны, если объект CMS делает , а не содержит данные, которые подписаны, то это отдельная подпись. Конечно, подтверждение подписи не может быть выполнено без копии данных, которые должны быть подписаны, поэтому, если подпись «отключена», тогда должен быть какой-то другой способ передачи самих данных в верификатор.

Отдельные подписи популярны в контексте криптографически защищенных электронных писем с помощью S/MIME (S/MIME можно охарактеризовать как «объект CMS в сообщениях электронной почты»), поскольку выделенная подпись затем отправляется как прикрепленный файл электронной почты, оставляя текст электронной почты содержимое нетронутым: таким образом, содержимое электронной почты все еще может быть прочитано программным обеспечением, которое полностью не знает, что может быть S/MIME, и не сможет извлечь данные из объекта CMS-данных.

В вашем случае вы должны производить все, что потребуется верификатору для выполнения своей работы. Это должно быть уже определено в протоколе, который вы в настоящее время реализуете. Возможно, протокол может сказать вам, что данные, которые должны быть подписаны, уже доступны верификатору через другой канал; или он может сказать вам, что вы должны использовать незакрепленный объект CMS, подписанный.

Если нет четко определенного протокола, и вы делаете это, как вы идете, то это рецепт катастрофы. Я очень надеюсь, что это не так. Криптография трудно использовать, главным образом потому, что нет возможности проверить, правильно ли вы это сделали.

0

Прежде всего, вам необходимо знать, в каком формате сервер ожидает отправки данных. Если вы используете PKCS # 7/CMS, вам не нужно что-либо слить.

PKCS # 7 поддерживает обертывание и снятие подписей. В первом случае вы получаете подписанные данные и подпись в одном блоке, и вы отправляете этот блок на сервер. Если вы создаете отдельную подпись, то у вас есть исходные данные и отдельный небольшой блок подписи.

Обычно отфильтрованные подписи используются, когда исходные данные должны оставаться читаемыми (из-за того, что упаковка данных сделает его недоступным для читателей, например, если вы подписываете файл PDF с использованием PKCS # 7, Acrobat не сможет откройте его правильно). Поэтому я думаю, что вы должны отправить подписанные данные в один блок.