Статус: Участник
Группы: Участники
Зарегистрирован: 14.02.2013(UTC) Сообщений: 24 Сказал(а) «Спасибо»: 6 раз
|
Всем доброго дня! Мне необходимо реализовать подпись клиентом xml документа, который присылается с сервера клиенту и отправку его на сервер обратно. В данный момент я научился подписывать обычный текст на стороне клиента в его браузере (используя крипто про плагин) его закрытым ключом и передачу результата на север. Так для простого текста получается следующий подписанный: Цитата: 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)
| Причина: Дополнение вопроса
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Автор: zvv235 Всем доброго дня!
Мне необходимо реализовать подпись клиентом xml документа, который присылается с сервера клиенту и отправку его на сервер обратно. Это хорошо, конечно, но подпись по какому стандарту ( xmlsig или pkcs7( cms))? Автор: zvv235 В данный момент я научился подписывать обычный текст на стороне клиента в его браузере (используя крипто про плагин) его закрытым ключом и передачу результата на север. Так для простого текста получается следующий подписанный: Это вообще нормально? Или я делаю что-то не то. Я всегда думал, что ЭЦП это к исходному тексту добавляется хеш код (как я понимаю, это набор символов определенной длинны) который шифруется закрытым ключом того, кто подписывает. Тогда каждый может сформировать хеш по тексту, открытым ключом расшифровать исходный хеш и сравнить: если совпадут - то подпись верна. Но в ответе нет и намека на исходный текст... Или ответ и есть только хеш код. Да, это нормально. На выходе закодированный в 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 ... |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
zvv235 оставлено 21.02.2013(UTC)
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Предварительно примеры (SDK) по КриптоПро.NET были просмотрены? \Crypto Pro\.NET SDK\Examples\simple\Xml\cs\SignDocument.cs |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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) с присоединенной ЭЦП. А как его расшифровать там уже примеров нет. Вот и приходится разбираться по чуть-чуть, задавая "тупые" вопросы
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.02.2013(UTC) Сообщений: 24 Сказал(а) «Спасибо»: 6 раз
|
Цитата: Предварительно примеры (SDK) по КриптоПро.NET были просмотрены? \Crypto Pro\.NET SDK\Examples\simple\Xml\cs\SignDocument.cs
Моя проблема в том, что пока что мне не хватает практических основ понимания как это работает. Теорию я понимаю, а вот как это все делать на практике - пока нет... Вот вчера весь вечер просидел, просматривая методы Gost3410CryptoServiceProvider, что б расшифровать полученный ответ, а оказывается вообще не там то и надо смотреть. А надо было смотреть CAPICOM. Андрей, спасибо за помощь, что помогаете разобраться в этом :)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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... |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
По присоединенной\отделенной подписи и кодировке результата: Capicom .SignКод: SignedData.Sign( _
[ ByVal Signer ], _
[ ByVal bDetached ], _
[ ByVal EncodingType ] _
)
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Автор: zvv235 Цитата:Это хорошо, конечно, но подпись по какому стандарту (xmlsig или pkcs7(cms))? Требований к стандарту у меня нет, так что выбирать могу любой. По крайней мере пока что. Рекомендую уточнить у заказчика. Если требуется подписывать xml (или другие данные) "как файл" - это одно... если требуется подписывать "ветку внутри" xml - совсем другое... |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 подписываю строку. И не так и важно, подписывать весь файл или его часть. Просто во втором случае надо знать, куда эту часть добавить в файл. Если я конечно все верно понимаю.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.02.2013(UTC) Сообщений: 24 Сказал(а) «Спасибо»: 6 раз
|
Цитата:Вот уже два часа смотрю примеры и документацию крипто про - везде только подписывается и проверяется подпись. Логика в проверке подписи есть тогда, когда зашифрованный хэш добавлен к файлу и мы видим содержимое. А если содержимого неизвестно и я имею только строку Цитата:MIIF1gYJKoZIhvcNAQcCoI ...... , то ее же надо как-то преобразовать в текст обратно, а не проверять подпись
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close