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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline zvv235  
#1 Оставлено : 20 февраля 2013 г. 21:59:22(UTC)
zvv235

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

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

Сказал(а) «Спасибо»: 6 раз
Всем доброго дня!

Мне необходимо реализовать подпись клиентом xml документа, который присылается с сервера клиенту и отправку его на сервер обратно.
В данный момент я научился подписывать обычный текст на стороне клиента в его браузере (используя крипто про плагин) его закрытым ключом и передачу результата на север. Так для простого текста
Цитата:
"Data for sign!"

получается следующий подписанный:
Цитата:

MIIF1gYJKoZIhvcNAQcCoIIFxzCCBcMCAQExDDAKBgYqhQMCAgkFADArBgkqhkiG
9w0BBwGgHgQcRABhAHQAYQAgAGYAbwByACAAcwBpAGcAbgAhAKCCA3kwggN1MIID
JKADAgECAgp/EmlIAAIAA5aPMAgGBiqFAwICAzBlMSAwHgYJKoZIhvcNAQkBFhFp
bmZvQGNyeXB0b3Byby5ydTELMAkGA1UEBhMCUlUxEzARBgNVBAoTCkNSWVBUTy1Q
Uk8xHzAdBgNVBAMTFlRlc3QgQ2VudGVyIENSWVBUTy1QUk8wHhcNMTMwMjE1MjEy
NjQxWhcNMTQxMDA0MDcwOTQxWjCBszEaMBgGCSqGSIb3DQEJARYLbWFpbDNAMy5j
b20xEDAOBgNVBAMMB9C40LzRjzMxJDAiBgNVBAsMG9C/0L7QtNGA0LDQt9C00LXQ
u9C10L3QuNC1MzEgMB4GA1UECgwX0L7RgNCz0LDQvdC40LfQsNGG0LjRjzMxFDAS
BgNVBAcMC9Cz0L7RgNC+0LQzMRgwFgYDVQQIDA/QvtCx0LvQsNGB0YLRjDMxCzAJ
BgNVBAYTAlVBMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQFkS
paAMOD2r77R4L0A74BCuJLWeRXr/XheZIGjlk3xvTizdBEiJbVxn5iB85GzONqP5
hnVxDwbUIP/2tBZd4S2jggFjMIIBXzAOBgNVHQ8BAf8EBAMCBPAwEwYDVR0lBAww
CgYIKwYBBQUHAwIwHQYDVR0OBBYEFH6eXSHP9AZykejZi5FKescBjjM0MB8GA1Ud
IwQYMBaAFG2PXgXZX6yRF5QelZoFMDg3ehAqMFUGA1UdHwROMEwwSqBIoEaGRGh0
dHA6Ly93d3cuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvVGVzdCUyMENlbnRlciUy
MENSWVBUTy1QUk8oMikuY3JsMIGgBggrBgEFBQcBAQSBkzCBkDAzBggrBgEFBQcw
AYYnaHR0cDovL3d3dy5jcnlwdG9wcm8ucnUvb2NzcG5jL29jc3Auc3JmMFkGCCsG
AQUFBzAChk1odHRwOi8vd3d3LmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3BraS1z
aXRlX1Rlc3QlMjBDZW50ZXIlMjBDUllQVE8tUFJPKDIpLmNydDAIBgYqhQMCAgMD
QQBqgxzlScSqP2qrAH0hUOzmX676Sn40Yn79RTQd799eeC1NYzFgtsS/RDbBd+/7
85zhvp1fCb9xUE3Q0ns8m+DtMYICBDCCAgACAQEwczBlMSAwHgYJKoZIhvcNAQkB
FhFpbmZvQGNyeXB0b3Byby5ydTELMAkGA1UEBhMCUlUxEzARBgNVBAoTCkNSWVBU
Ty1QUk8xHzAdBgNVBAMTFlRlc3QgQ2VudGVyIENSWVBUTy1QUk8CCn8SaUgAAgAD
lo8wCgYGKoUDAgIJBQCgggEqMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJ
KoZIhvcNAQkFMQ8XDTEzMDIyMDE5MDQzNFowLwYJKoZIhvcNAQkEMSIEICxP6F6S
0x+KKWa+FUmbpEItBuT/KnFUIb4T298nWmtVMIG+BgsqhkiG9w0BCRACLzGBrjCB
qzCBqDCBpTAIBgYqhQMCAgkEIHrNEXUxjuBxZW6J1TZz6aZycibeV5OgwgFpgi+Z
/Vt/MHcwaaRnMGUxIDAeBgkqhkiG9w0BCQEWEWluZm9AY3J5cHRvcHJvLnJ1MQsw
CQYDVQQGEwJSVTETMBEGA1UEChMKQ1JZUFRPLVBSTzEfMB0GA1UEAxMWVGVzdCBD
ZW50ZXIgQ1JZUFRPLVBSTwIKfxJpSAACAAOWjzAKBgYqhQMCAhMFAARA6KCEyncS
JBTsUPQ521QoweKsCs6Qe9Aue/e2VREN1/rqQrUhN7y4Wep4Hljo/1lW1a5KKLU9
1zPrEMgGPJrGqQ==


Это вообще нормально? Или я делаю что-то не то. Я всегда думал, что ЭЦП это к исходному тексту добавляется хеш код (как я понимаю, это набор символов определенной длинны) который шифруется закрытым ключом того, кто подписывает. Тогда каждый может сформировать хеш по тексту, открытым ключом расшифровать исходный хеш и сравнить: если совпадут - то подпись верна. Но в ответе нет и намека на исходный текст... Или ответ и есть только хеш код.
Вот пример, как я его формирую в javascript (с помощью крипто про плагина на клиенте)
Цитата:

function SignData(DataForSign) {
// Необходимые константы
var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_CURRENT_USER_STORE = 2;
// проверяем, что поддерживаются ActiveXObject (Internet Explorer)
if (window.ActiveXObject) {

try {
//Создаем необходимые объекты ActiveX
var CertStore = new ActiveXObject("CAPICOM.Store");
var Signer = new ActiveXObject("CAPICOM.Signer");
var SignedAuth = new ActiveXObject("CAPICOM.SignedData");
//Открываем хранилище сертификатов пользователя только для чтения
CertStore.Open(CAPICOM_CURRENT_USER_STORE, "MY", CAPICOM_STORE_OPEN_READ_ONLY);
//Выводим пользователю окно выбора сертификата
try {
var certificate = CertStore.Certificates.Select("Выберите сертификат для подписи документа.",
"Выберите один из сертификатов", false);
}
catch (e) {
// Пользователь не выбрал сертификат
return false;
}
//Подписываемые данные
SignedAuth.Content = /*"Дата подписи: " + (new Date()) + ", Данные: " +*/ DataForSign;
//Выбранный сертификат
Signer.Certificate = certificate.Item(1);
//Сюда запишем данные (можно писать в hidden поле, тут сделано для примера)
//var lblData = document.getElementById('< %= tbSignedData.ClientID %>');
// Подписываем
var res = SignedAuth.Sign(Signer, false);
alert('Data was signed successfully!!!\n' + res);
return res;
} catch (e) {
alert('Невозможно подписать данные.\nУбедитесь что браузером разрешно использование ActiveX. \nДобавьте сайт в Trusted Sites.\n'
+ 'Ошибка: ' + e.message);
return null;
}
}
else {
alert('Используйте Internet Explorer для просмотра данного сайта');
return null;
}


И как, передав это на сервер, мне проверить подпись клиента и расшифровать подписанную информацию? Открытый ключ клиента у меня есть.
В пространснтве имен Gost3410CryptoServiceProvider (проект на с#)я нашел метод public bool VerifyData(byte[] buffer, Object hashAlg, byte[] signature) и больше ничего. Как практически применить открытый сертификат клиента для преобразования ответа обратно в "Data for sign!" на сервере и проверить, что это подписано именно этим клиентом?

Отредактировано пользователем 20 февраля 2013 г. 22:39:13(UTC)  | Причина: Дополнение вопроса

Offline Андрей Писарев  
#2 Оставлено : 20 февраля 2013 г. 23:12:24(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: zvv235 Перейти к цитате
Всем доброго дня!

Мне необходимо реализовать подпись клиентом xml документа, который присылается с сервера клиенту и отправку его на сервер обратно.


Это хорошо, конечно, но подпись по какому стандарту (xmlsig или pkcs7(cms))?



Автор: zvv235 Перейти к цитате

В данный момент я научился подписывать обычный текст на стороне клиента в его браузере (используя крипто про плагин) его закрытым ключом и передачу результата на север. Так для простого текста
Цитата:
"Data for sign!"

получается следующий подписанный:
Цитата:

MIIF1gYJKoZ .....

Это вообще нормально? Или я делаю что-то не то. Я всегда думал, что ЭЦП это к исходному тексту добавляется хеш код (как я понимаю, это набор символов определенной длинны) который шифруется закрытым ключом того, кто подписывает. Тогда каждый может сформировать хеш по тексту, открытым ключом расшифровать исходный хеш и сравнить: если совпадут - то подпись верна. Но в ответе нет и намека на исходный текст... Или ответ и есть только хеш код.


Да, это нормально. На выходе закодированный в base64 ответ (pks#7) с присоединенной ЭЦП
(т.е. вместе с подписанным текстом).

p.s. а чему собственно Вы научились? SDK по CAPICOM от MS не видели, да? Там "этот пример есть".



Автор: zvv235 Перейти к цитате

Вот пример, как я его формирую в javascript (с помощью крипто про плагина на клиенте)
Цитата:

function SignData(DataForSign) {
// Необходимые константы
var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_CURRENT_USER_STORE = 2;
// проверяем, что поддерживаются ActiveXObject (Internet Explorer)
if (window.ActiveXObject) {

try {
//Создаем необходимые объекты ActiveX
var CertStore = new ActiveXObject("CAPICOM.Store");
var Signer = new ActiveXObject("CAPICOM.Signer");
var SignedAuth = new ActiveXObject("CAPICOM.SignedData");
//Открываем хранилище сертификатов пользователя только для чтения
CertStore.Open(CAPICOM_CURRENT_USER_STORE, "MY", CAPICOM_STORE_OPEN_READ_ONLY);
//Выводим пользователю окно выбора сертификата
try {
var certificate = CertStore.Certificates.Select("Выберите сертификат для подписи документа.",
"Выберите один из сертификатов", false);
}
catch (e) {
// Пользователь не выбрал сертификат
return false;
}
//Подписываемые данные
SignedAuth.Content = /*"Дата подписи: " + (new Date()) + ", Данные: " +*/ DataForSign;
//Выбранный сертификат
Signer.Certificate = certificate.Item(1);
//Сюда запишем данные (можно писать в hidden поле, тут сделано для примера)
//var lblData = document.getElementById('< %= tbSignedData.ClientID %>');
// Подписываем
var res = SignedAuth.Sign(Signer, false);
alert('Data was signed successfully!!!\n' + res);
return res;
} catch (e) {
alert('Невозможно подписать данные.\nУбедитесь что браузером разрешно использование ActiveX. \nДобавьте сайт в Trusted Sites.\n'
+ 'Ошибка: ' + e.message);
return null;
}
}
else {
alert('Используйте Internet Explorer для просмотра данного сайта');
return null;
}



Открою страшную тайну - в приведенном коде НЕ используется КриптоПРО плагин.
Используется CAPICOM от MS.

Примеры с плагином от КриптоПРО - в руководстве разработчика. Сравните имеющееся у Вас с примером.

Автор: zvv235 Перейти к цитате

И как, передав это на сервер, мне проверить подпись клиента и расшифровать подписанную информацию? Открытый ключ клиента у меня есть.


Проверить можно... используя тот же CAPICOM ...



Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
zvv235 оставлено 21.02.2013(UTC)
Offline Андрей Писарев  
#3 Оставлено : 20 февраля 2013 г. 23:20:47(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Предварительно примеры (SDK) по КриптоПро.NET были просмотрены?

\Crypto Pro\.NET SDK\Examples\simple\Xml\cs\SignDocument.cs

Shhh


Техническую поддержку оказываем тут
Наша база знаний
Offline zvv235  
#4 Оставлено : 21 февраля 2013 г. 12:00:11(UTC)
zvv235

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

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

Сказал(а) «Спасибо»: 6 раз
Цитата:
Это хорошо, конечно, но подпись по какому стандарту (xmlsig или pkcs7(cms))?

Требований к стандарту у меня нет, так что выбирать могу любой. По крайней мере пока что.

Цитата:
Да, это нормально. На выходе закодированный в base64 ответ (pks#7) с присоединенной ЭЦП
(т.е. вместе с подписанным текстом).

Спасибо :)

Цитата:
p.s. а чему собственно Вы научились? SDK по CAPICOM от MS не видели, да? Там "этот пример есть".

Научился хотя бы все это запускать и проверять. А то это тоже создавало кучу проблем.
Например, всегда возникало исключение в одной из этих строк (сейчас точно не помню в какой)
Цитата:

var CertStore = new ActiveXObject("CAPICOM.Store");
var Signer = new ActiveXObject("CAPICOM.Signer");
var SignedAuth = new ActiveXObject("CAPICOM.SignedData");

хотя ActiveX был разрешен. После установки Крипто ПРО плагина проблема исчезла. Потому то я и сделал неверный вывод, что это из-за не установленого плагина.

Цитата:
Проверить можно... используя тот же CAPICOM ...

Это хорошо. Буду разбираться как CAPICOM подключается к с#...

Цитата:
Предварительно примеры (SDK) по КриптоПро.NET были просмотрены?
\Crypto Pro\.NET SDK\Examples\simple\Xml\cs\SignDocument.cs

Честно сказать были просмотрены и не раз. Но моменты, как расшифровать что-то или проверить подпись не понятны. В примере, насколько я помню, подписывается что-то в C# и подписывается оно добавлением хеш кода с подписью к содержимому xml документа. А у меня же получается, как Вы говорите, в base64 ответ (pks#7) с присоединенной ЭЦП. А как его расшифровать там уже примеров нет. Вот и приходится разбираться по чуть-чуть, задавая "тупые" вопросы
Offline zvv235  
#5 Оставлено : 21 февраля 2013 г. 12:09:57(UTC)
zvv235

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

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

Сказал(а) «Спасибо»: 6 раз
Цитата:

Предварительно примеры (SDK) по КриптоПро.NET были просмотрены?
\Crypto Pro\.NET SDK\Examples\simple\Xml\cs\SignDocument.cs

Моя проблема в том, что пока что мне не хватает практических основ понимания как это работает. Теорию я понимаю, а вот как это все делать на практике - пока нет...
Вот вчера весь вечер просидел, просматривая методы Gost3410CryptoServiceProvider, что б расшифровать полученный ответ, а оказывается вообще не там то и надо смотреть. А надо было смотреть CAPICOM.
Андрей, спасибо за помощь, что помогаете разобраться в этом :)
Offline Андрей Писарев  
#6 Оставлено : 21 февраля 2013 г. 12:18:57(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: zvv235 Перейти к цитате
....
Научился хотя бы все это запускать и проверять. А то это тоже создавало кучу проблем.
Например, всегда возникало исключение в одной из этих строк (сейчас точно не помню в какой)
Цитата:

var CertStore = new ActiveXObject("CAPICOM.Store");
var Signer = new ActiveXObject("CAPICOM.Signer");
var SignedAuth = new ActiveXObject("CAPICOM.SignedData");

хотя ActiveX был разрешен. После установки Крипто ПРО плагина проблема исчезла. Потому то я и сделал неверный вывод, что это из-за не установленого плагина.


Исключение было по причине отсутствия установленного CAPICOM на вашем РМ.
При установке плагина - ставится и CAPICOM...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#7 Оставлено : 21 февраля 2013 г. 12:21:15(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
По присоединенной\отделенной подписи и кодировке результата:
Capicom .Sign

Код:
 SignedData.Sign( _
  [ ByVal Signer ], _
  [ ByVal bDetached ], _
  [ ByVal EncodingType ] _
)
 

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#8 Оставлено : 21 февраля 2013 г. 12:49:46(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: zvv235 Перейти к цитате
Цитата:
Это хорошо, конечно, но подпись по какому стандарту (xmlsig или pkcs7(cms))?

Требований к стандарту у меня нет, так что выбирать могу любой. По крайней мере пока что.


Рекомендую уточнить у заказчика.
Если требуется подписывать xml (или другие данные) "как файл" - это одно...
если требуется подписывать "ветку внутри" xml - совсем другое...



Техническую поддержку оказываем тут
Наша база знаний
Offline zvv235  
#9 Оставлено : 22 февраля 2013 г. 20:30:06(UTC)
zvv235

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

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

Сказал(а) «Спасибо»: 6 раз
Цитата:
Проверить можно... используя тот же CAPICOM ...

А расшифровать подписанный текст можно с помощью Gost3410CryptoServiceProvider возможно?
В интернете есть примеры, где криптопровайдер расшифровывает данные, например:

Цитата:
X509Certificate2 cert = new X509Certificate2(fileName, password, X509KeyStorageFlags.Exportable);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] decrypted = rsa.Decrypt(encryptedString, false);
decryptedString = Encoding.Default.GetString(decrypted);


Вот уже два часа смотрю примеры и документацию крипто про - везде только подписывается и проверяется подпись. Но как расшифровать данные, я найти не могу :(
Может ли Gost3410CryptoServiceProvider делать аналогичные операции?

Цитата:
Рекомендую уточнить у заказчика.
Если требуется подписывать xml (или другие данные) "как файл" - это одно...
если требуется подписывать "ветку внутри" xml - совсем другое...

Уточню. Ну я так понимаю, что разницы в реализации подписи части файла особой нет? Я же все равно в javascript подписываю строку. И не так и важно, подписывать весь файл или его часть. Просто во втором случае надо знать, куда эту часть добавить в файл. Если я конечно все верно понимаю.
Offline zvv235  
#10 Оставлено : 22 февраля 2013 г. 20:34:47(UTC)
zvv235

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

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

Сказал(а) «Спасибо»: 6 раз
Цитата:
Вот уже два часа смотрю примеры и документацию крипто про - везде только подписывается и проверяется подпись.

Логика в проверке подписи есть тогда, когда зашифрованный хэш добавлен к файлу и мы видим содержимое. А если содержимого неизвестно и я имею только строку
Цитата:
MIIF1gYJKoZIhvcNAQcCoI ......

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