Статус: Участник
Группы: Участники
Зарегистрирован: 27.04.2012(UTC) Сообщений: 15
Сказал(а) «Спасибо»: 3 раз
|
Добрый день!
Занимаюсь разбором ответов от тестового штампа времени. В ответе есть поле подпись. Хочу спросить это подпись каких аттрибутов? И как можно её проверить? (сертификат сервера штампов времени есть)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.04.2012(UTC) Сообщений: 15
Сказал(а) «Спасибо»: 3 раз
|
Этот хеш формируется от конкатинации этих атрибутов? Сущностей из пакета ru.CryptoPro.JCP.ASN.PKIXTSP не хватит для проверки? TSTInfo например легко получается из запроса.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,977 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 708 раз в 669 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.04.2012(UTC) Сообщений: 15
Сказал(а) «Спасибо»: 3 раз
|
Добрый день!
До обращения на форум я разумеется читал стандарт rfc3161. Сертификат подписи я тоже получил из ответа от штампа времени. С формированием и декодированием штампа проблем не было, вопрос был не в том. Рядом с подписанным документом необходимо хранить штамп времени и необходимо чтобы эти метаданные были тоже защищены от изменения. Теперь нужно хранить SignedData из штампа времени, атрибуты которого защищены от подделки подписью, и кроме того SignedData содержит в себе информацию о времени подписания и хеш исходного документа. Я правильно понимаю?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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;
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 27.04.2012(UTC) Сообщений: 15
Сказал(а) «Спасибо»: 3 раз
|
Это функция работает. Большое спасибо за помощь!
Ещё один маленький ньанс: если заменить Signature sig = Signature.getInstance("GOST3411withGOST3410EL"); на Signature sig = Signature.getInstance(JCP.CRYPTOPRO_SIGN_NAME); то функция выдаёт false. Следует понимать что сервер штампов времени подписывает несовместимо с CSP?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,977 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 708 раз в 669 постах
|
Пожалуйста. Совместимость обязательно должна быть, это обстоятельство я проверю. Указывайте алгоритмы явно, например, JCP.GOST_DHEL_SIGN_NAME JCP.GOST_EL_SIGN_NAME |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close