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

Уведомление

Icon
Error

46 Страницы«<3132333435>»
Опции
К последнему сообщению К первому непрочитанному
Offline Новожилова Елена  
#321 Оставлено : 26 марта 2013 г. 13:03:55(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
При проверке, когда задаете значение свойства Content нужно также предварительно указать кодировку.
thanks 1 пользователь поблагодарил Новожилова Елена за этот пост.
forik оставлено 26.03.2013(UTC)
Offline forik  
#322 Оставлено : 26 марта 2013 г. 14:37:17(UTC)
forik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Спасибо, помогло )
Но вот еще вопрос. Каким образом осуществить проверку только подписи без проверки сертификатов?

Так не получается:
Код:
VerifyCades(signed, CADES_BES, true /*detached*/, CAPICOM_VERIFY_SIGNATURE_ONLY)
Offline Новожилова Елена  
#323 Оставлено : 28 марта 2013 г. 13:12:32(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Код:
VerifyCades (
   BSTR SignedMessage,
   CADESCOM_CADES_TYPE CadesType,
   VARIANT_BOOL bDetached
 );


В плагине (и в CADESCOM тоже) не предусмотрена возможность проверки подписи отдельно от проверки цепочки сертификатов.

Если вам необходимо проверить только криптографическую подпись, вы можете воспользоваться объектом SignedData из состава Microsoft CAPICOM.
Offline Slavik17  
#324 Оставлено : 29 марта 2013 г. 15:39:42(UTC)
Slavik17

Статус: Новичок

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

Поблагодарили: 2 раз в 2 постах
Добрый день!

Как я понял, метод SignHash объекта CAdESCOM.RawSignature пока не работает в плагине? При выполнении метода всегда возникает ошибка: "Keyset does not exist (0x80090016)". Ключ находится на etoken. Подпись формата PKCS#7 с помощью данного ключа создается без проблем.
Offline GostyCtypto  
#325 Оставлено : 1 апреля 2013 г. 10:59:37(UTC)
GostyCtypto

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

Группы: Участники
Зарегистрирован: 01.04.2013(UTC)
Сообщений: 17
Мужчина
Российская Федерация
Откуда: ООО &quot;ЦентрПрограммСистем&quot;

Сказал «Спасибо»: 8 раз
Здравствуйте!

А то я почитал тему Подпись XML (СМЭВ) и у меня получается хеш (по алгоритму ГОСТ Р 34.11-94 через КриптоПро ЭЦП Browser plug-in):
Цитата:
981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0

что совпадает с данными из темы.
Далее получаю base64 от пустой строки (от примеденного хеша, записанное строкой):
Цитата:
OTgxRTVGM0NBMzBDODQxNDg3ODMwRjg0RkI0MzNFMTNBQzExMDE1NjlCOUMxMzU4NEFDNDgzMjM0Q0Q2NTZDMA==

Что явно не соответствует base64 для хеша пустой строки:
Цитата:
mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=


При этом base64 из wiki:
Цитата:
TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0
aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1
c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0
aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdl
LCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=

Нормально декодирует в:
Цитата:
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.

И обратно то же...

Как base64 рассчитывается что бы из
Цитата:
981E5F3CA30C841487830F84FB433E13AC1101569B9C13584AC483234CD656C0

получилось
Цитата:
mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=

мне вообще не понятно...

Получаю я так (на основе примера):
Цитата:

var HashedData = CreateObject("CAdESCOM.HashedData");
HashedData.Hash("");
alert(HashedData.Value);
alert(JSZipBase64.encode(HashedData.Value));

Если я что-то делаю не так, то, пожалуйста, поправьте меня...
Класс JSZipBase64 взят из библиотеки JSZip.
Так же проверял на C#, не подписывая XML, а именно рассчитывая base64 - результат мой...
Вот и думаю теперь, в чем же косяк у меня...


Вообще мне нужно на JS подписать XML для SOAP (для СМЭВ)...
Решил начать с получения SignatureValue от SignedInfo:
Код:
        <SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
          <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" />
          <Reference URI="#body">
            <Transforms>
              <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
              <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" />
            <DigestValue>JJDTZ3V8kaKUx2rP8LeYTyh4zAO7MdGyT677Qhdv3HQ=</DigestValue>
          </Reference>
        </SignedInfo>


Должен получиться base64 такой:
Цитата:
49RkjMMIYfJq1zWFjZi0oxpt2xaK+Ky5Zcqrf4W86XBGgHTOmYUrc1cfYjSwoWuyC7tTTGnBjHQ0mkLA383r6A==


Этот хеш получается после подписывания через программу на C#...
Итоговая XML проходит валидацию на ГосУслугах.
Потому я и думаю, что сейчас base64 получается на правильный...
Может ещё какой-то параметр нужен для HashedData или какие ещё классы CAdESCOM имеются для получения корректных данных ?

Отредактировано пользователем 2 апреля 2013 г. 11:35:47(UTC)  | Причина: уточнен вопрос

Offline Slavik17  
#326 Оставлено : 2 апреля 2013 г. 14:02:13(UTC)
Slavik17

Статус: Новичок

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

Поблагодарили: 2 раз в 2 постах
GostyCtypto, попробуй так.

var str=oHashedData.Value;
var strHash = "";
var b;
var s = new Array(str.length);
for (var i=0; i<str.length; i+=1) {
switch (str.substr(i, 1)) {
case 'A':
b=10;
break;
case 'B':
b=11;
break;
case 'C':
b=12;
break;
case 'D':
b=13;
break;
case 'E':
b=14;
break;
case 'F':
b=15;
break;
default :
b=str.substr(i, 1);
}
s[i]=b;
}

for (var i=0; i<s.length; i+=2) {
b = s[i]*16+parseInt(s[i+1]);
strHash += String.fromCharCode(b);
}

var base64Hash = JSZipBase64.encode(strHash);
window.alert("base64Hash: "+base64Hash);

Отредактировано пользователем 2 апреля 2013 г. 14:02:47(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Slavik17 за этот пост.
GostyCtypto оставлено 02.04.2013(UTC)
Offline GostyCtypto  
#327 Оставлено : 2 апреля 2013 г. 15:16:52(UTC)
GostyCtypto

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

Группы: Участники
Зарегистрирован: 01.04.2013(UTC)
Сообщений: 17
Мужчина
Российская Федерация
Откуда: ООО &quot;ЦентрПрограммСистем&quot;

Сказал «Спасибо»: 8 раз
Хм... Спасибо, Slavik17, я бы и не подумал... Казалось, что все сложнее должно быть...
Теперь,
Цитата:
var HashedData = ObjCreator("CAdESCOM.HashedData");
HashedData.Hash("");
var str = HashedData.Value;
var strHash = "";
var b;
var s = new Array(str.length);
for (var i=0; i<str.length; i+=1) {
switch (str.substr(i, 1)) {
case 'A':
b=10;
break;
case 'B':
b=11;
break;
case 'C':
b=12;
break;
case 'D':
b=13;
break;
case 'E':
b=14;
break;
case 'F':
b=15;
break;
default :
b=str.substr(i, 1);
}
s=b;
}

for (var i=0; i<s.length; i+=2) {
b = s*16+parseInt(s[i+1]);
strHash += String.fromCharCode(b);
}

var base64Hash = JSZipBase64.encode(strHash);
window.alert("base64Hash: "+base64Hash);

выводится коорректный результат для пустой строки (я надеюсь, что это действительно корректно):
Цитата:
base64Hash: mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=


Однако с фрагментом XML что я привел так гладко не вышло...
Когда я его привел к каноническому виду, если конечно не ошибся:
Код:
<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"></SignatureMethod><Reference URI="#body"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></DigestMethod><DigestValue>JJDTZ3V8kaKUx2rP8LeYTyh4zAO7MdGyT677Qhdv3HQ=</DigestValue></Reference></SignedInfo>

Получаю
Цитата:
MzA4MDMwQ0Q1NjVCRTU5OTE2NUIxRDhCMzI2NDQ0RkU5RTAyMkM2RDNCNDVFMDEyMzFCMDE2NjY2RTEyMUM5RA==

и (используя Ваш, Slavik17, совет)
Цитата:
MMKAMMONVlvDpcKZFlsdwosyZETDvsKeAixtO0XDoBIxwrAWZm4SHMKd

в то время как должно получиться
Цитата:
49RkjMMIYfJq1zWFjZi0oxpt2xaK+Ky5Zcqrf4W86XBGgHTOmYUrc1cfYjSwoWuyC7tTTGnBjHQ0mkLA383r6A==

Как я так понимаю, алгоритм ГОСТ Р 34.11-2001 которым нужно рассчитать электронную подпись не есть кеш по алгоритму ГОСТ Р 34.11-94...
Значит я ошибаюсь когда пытаюсь рассчитать SignatureValue используя CAdESCOM.HashedData...

Но что тогда использовать ?
Не CAdESCOM.CPSigner же, который, вроде бы, применяется к Body для получения BinarySecurityToken , то есть получения сертификата (подписи данных, или как оно в терминологии СМЭВ называется)...
А CAdESCOM.HashedData, как теперь стало ясно, то же применяется к [i]Body
, для получения [i]DigestValue
(что сейчас проверяю на практике, еще с канонизаций (Canonicalization) xml нужно разобраться)...

Есть предположение, что нужно смотреть в сторону CAdESCOM.RawSignature, однако в документации эта страница не открывается и методом научного тыка с этим классом разобраться пока не получается...
Или, как вы, Slavik17, заметили, этот объект не работает и следует использовать что-то другое ?

Примеры, у меня так же не вышло, поэтому надеюсь кто-нибудь подскажет как рассчитать подпись по ГОСТ Р 34.11-2001...

Отредактировано пользователем 2 апреля 2013 г. 15:34:07(UTC)  | Причина: дополнение вопроса

Offline Slavik17  
#328 Оставлено : 2 апреля 2013 г. 15:39:20(UTC)
Slavik17

Статус: Новичок

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

Поблагодарили: 2 раз в 2 постах
GostyCtypto, уже работает.

Не надо путать hash и подпись hash.
var sign = oRawSignature.SignHash(oHashedData, oCertificate);
И т.д. по аналогии с HashedData.

Отредактировано пользователем 2 апреля 2013 г. 15:43:04(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Slavik17 за этот пост.
GostyCtypto оставлено 02.04.2013(UTC)
Offline GostyCtypto  
#329 Оставлено : 2 апреля 2013 г. 16:16:56(UTC)
GostyCtypto

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

Группы: Участники
Зарегистрирован: 01.04.2013(UTC)
Сообщений: 17
Мужчина
Российская Федерация
Откуда: ООО &quot;ЦентрПрограммСистем&quot;

Сказал «Спасибо»: 8 раз
Набросал функцию:
Цитата:
function GetSign(certSubjectName, dataToSign) {
try {
var oHashedData = ObjCreator("CAdESCOM.HashedData");
oHashedData.Hash(dataToSign);
} catch (err) {
alert('Не удалось создать CAPICOM.HashedData: ' + GetErrorMessage(err));
return;
}
try {
var oStore = ObjCreator("CAPICOM.store");
oStore.Open();
} catch (err) {
alert('Не удалось создать CAPICOM.store: ' + GetErrorMessage(err));
return;
};
var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
var oCerts = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, certSubjectName);
if (oCerts.Count == 0) {
alert("Сертификат не найден");
return;
};
var oCert = oCerts.Item(1);
try {
var oRawSignature = ObjCreator("CAdESCOM.RawSignature");
} catch (err) {
alert('Не удалось создать CAdESCOM.RawSignature: ' + GetErrorMessage(err));
return;
};
if (oRawSignature) {
return oRawSignature.SignHash(oHashedData, oCert);
} else {
alert("Не удалось создать RawSignature!");
return;
}
}

Вызываю так:
Цитата:
GetSign('<ТУТ ХЕШ ПОДПИСИ>','<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"></SignatureMethod><Reference URI="#body"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></DigestMethod><DigestValue>JJDTZ3V8kaKUx2rP8LeYTyh4zAO7MdGyT677Qhdv3HQ=</DigestValue></Reference></SignedInfo>');

В результате у меня запрашивается PIN (Token вставлен) и вываливается ошибка:
Цитата:
Key does not exist. (0x8009000D)

На строке
Цитата:
oRawSignature.SignHash(oHashedData, oCert);

Slavik17, кажется у Вас была такая же ошибка... Вам удалось её решить?

Или я вас не правильно понял...
Цитата:
Не надо путать hash и подпись hash.
var sign = oRawSignature.SignHash(oHashedData, oCertificate);
И т.д. по аналогии с HashedData.

Что для рассчитывается электронная подпись по алгоритму ГОСТ Р 34.11-2001 от SignedInfo нужно использовать RawSignature ?

Отредактировано пользователем 2 апреля 2013 г. 16:26:19(UTC)  | Причина: уточнение вопроса

Offline Slavik17  
#330 Оставлено : 2 апреля 2013 г. 16:22:55(UTC)
Slavik17

Статус: Новичок

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

Поблагодарили: 2 раз в 2 постах
GostyCtypto, всё правильно. Скачайте новую версию плагина. Там эта ошибка исправлена.

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