Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline dirt  
#1 Оставлено : 27 апреля 2012 г. 18:21:33(UTC)
dirt

Статус: Участник

Группы: Участники
Зарегистрирован: 27.04.2012(UTC)
Сообщений: 15

Сказал(а) «Спасибо»: 3 раз
Добрый день!

Занимаюсь разбором ответов от тестового штампа времени.
В ответе есть поле подпись. Хочу спросить это подпись каких аттрибутов? И как можно её проверить? (сертификат сервера штампов времени есть)
Offline Евгений Афанасьев  
#2 Оставлено : 27 апреля 2012 г. 19:32:13(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Здравствуйте.
Это хэш с значений подписываемых аттрибутов, OID'ы которых, например, 1.2.840.113549.1.9.3, 1.2.840.113549.1.9.4, 1.2.840.113549.1.9.16.2.12, 1.2.840.113549.1.9.16.2.47.
Проверить подпись можно, например, с помощью BouncyCastle, который содержит различные классы для работы со штампом времени.

Отредактировано пользователем 27 апреля 2012 г. 19:38:20(UTC)  | Причина: Не указана

Offline dirt  
#3 Оставлено : 27 апреля 2012 г. 19:56:12(UTC)
dirt

Статус: Участник

Группы: Участники
Зарегистрирован: 27.04.2012(UTC)
Сообщений: 15

Сказал(а) «Спасибо»: 3 раз
Этот хеш формируется от конкатинации этих атрибутов?
Сущностей из пакета ru.CryptoPro.JCP.ASN.PKIXTSP не хватит для проверки?
TSTInfo например легко получается из запроса.
Offline Евгений Афанасьев  
#4 Оставлено : 27 апреля 2012 г. 22:06:56(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Сущностей вполне достаточно для формирования и декодирования штампа,
http://www.cryptopro.ru/....aspx?g=posts&t=3891
http://www.cryptopro.ru/....aspx?g=posts&t=3960
Сам штамп может содержать сертификат подписи внутри (и ссылку на него в виде подписанного аттрибута signing-certificateV2).
Подробное описание можно найти тут: http://tools.ietf.org/html/rfc3161 и тут http://tools.ietf.org/html/rfc2630#page-11 п. 5.4
Да, хеш получают с DER-кодированных аттрибутов, например, так: update(attr[i])


Offline dirt  
#5 Оставлено : 28 апреля 2012 г. 14:24:36(UTC)
dirt

Статус: Участник

Группы: Участники
Зарегистрирован: 27.04.2012(UTC)
Сообщений: 15

Сказал(а) «Спасибо»: 3 раз
Добрый день!

До обращения на форум я разумеется читал стандарт rfc3161. Сертификат подписи я тоже получил из ответа от штампа времени. С формированием и декодированием штампа проблем не было, вопрос был не в том.
Рядом с подписанным документом необходимо хранить штамп времени и необходимо чтобы эти метаданные были тоже защищены от изменения.
Теперь нужно хранить SignedData из штампа времени, атрибуты которого защищены от подделки подписью, и кроме того SignedData содержит в себе информацию о времени подписания и хеш исходного документа.
Я правильно понимаю?
Offline dirt  
#6 Оставлено : 28 апреля 2012 г. 18:59:51(UTC)
dirt

Статус: Участник

Группы: Участники
Зарегистрирован: 27.04.2012(UTC)
Сообщений: 15

Сказал(а) «Спасибо»: 3 раз
Тогда если я правильно понял, например, функция checkSignatureCMS должна вернуть true, при передаче ей в качестве параметров сертификат Demo TSA Operator и SignedData, полученое из штампа времени.
Но возвращает false. В чём может быть дело?

Код:
private boolean checkSignatureCMS(SignedData cms, Certificate cert) {
		boolean res = false;

		try {
			Signature sig = Signature.getInstance(Constants.ALGORITHM_SIGN);
			sig.initVerify(cert.getPublicKey());
			SignedAttributes atts = cms.signerInfos.elements[0].signedAttrs;
			for (Attribute a : atts.elements) {
				Asn1DerEncodeBuffer buf = new Asn1DerEncodeBuffer();
				a.values.encode(buf);
				byte[] attrBytes = buf.getMsgCopy();
				for (int i = 0; i < attrBytes.length; i++) {
					sig.update(attrBytes[i]);
			}	}
			SignatureValue signature = cms.signerInfos.elements[0].signature;
			res = sig.verify(signature.value);

		} catch (Exception e) {
			e.printStackTrace();
		}

		return res;
}


Код:
TimeStampToken tsToken = response.timeStampToken;
Asn1DerEncodeBuffer encData = new Asn1DerEncodeBuffer();
tsToken.encode(encData);
byte[] contbytes = encData.getMsgCopy();
		
ContentInfo content = new ContentInfo();
content.decode(new Asn1DerDecodeBuffer(contbytes));
					
SignedData cms = (SignedData) content.content;
Offline Евгений Афанасьев  
#7 Оставлено : 28 апреля 2012 г. 19:56:22(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Попробуйте так:
Код:


boolean checkSignatureCMS(SignedData cms, Certificate cert) {
        
       boolean res = false;

        try {
        	
            Signature sig = Signature.getInstance("GOST3411withGOST3410EL");
            sig.initVerify(cert.getPublicKey());
            
            SignerInfo info = cms.signerInfos.elements[0];
            
            final Asn1BerEncodeBuffer encBufSignedAttr = new Asn1BerEncodeBuffer();
            info.signedAttrs.encode(encBufSignedAttr);
            byte[] data = encBufSignedAttr.getMsgCopy();
            
            sig.update(data);

            SignatureValue signature = cms.signerInfos.elements[0].signature;
            res = sig.verify(signature.value);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return res;
}


Вообще существует подпись CAdES-X Long Type 1, которая содержит все необходимые штампы и доказательства.

Отредактировано пользователем 28 апреля 2012 г. 19:58:05(UTC)  | Причина: Не указана

Offline dirt  
#8 Оставлено : 28 апреля 2012 г. 20:46:51(UTC)
dirt

Статус: Участник

Группы: Участники
Зарегистрирован: 27.04.2012(UTC)
Сообщений: 15

Сказал(а) «Спасибо»: 3 раз
Это функция работает. Большое спасибо за помощь!

Ещё один маленький ньанс:
если заменить
Signature sig = Signature.getInstance("GOST3411withGOST3410EL");
на
Signature sig = Signature.getInstance(JCP.CRYPTOPRO_SIGN_NAME);
то функция выдаёт false.
Следует понимать что сервер штампов времени подписывает несовместимо с CSP?

Offline Евгений Афанасьев  
#9 Оставлено : 28 апреля 2012 г. 20:57:43(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Пожалуйста.
Совместимость обязательно должна быть, это обстоятельство я проверю.
Указывайте алгоритмы явно, например,
JCP.GOST_DHEL_SIGN_NAME
JCP.GOST_EL_SIGN_NAME
Offline Евгений Афанасьев  
#10 Оставлено : 2 мая 2012 г. 17:32:14(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Режим CRYPTOPRO_SIGN_NAME для совместимости с CSP в случае, когда подпись развернутая. В штампе подпись прямая, потому если вы хотите проверить в этом режиме, подпись надо развернуть, например, так:
Код:

...
import org.apache.commons.lang3.ArrayUtils;
...
Signature sig = Signature.getInstance(JCP.CRYPTOPRO_SIGN_NAME);
...
ArrayUtils.reverse(signature.value);
// Теперь проверяем
res = sig.verify(signature.value);

ArrayUtils можно получить из commons-lang3-3.1.jar (http://commons.apache.org/lang/download_lang.cgi).

Отредактировано пользователем 2 мая 2012 г. 17:32:52(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.