001. Криптография и цифровая подпись RSA-sha256 на платформе 1С

Внешняя компонента, исходники, обработка для 1С.

Эта статья описывает готовое решение для выполнения задач по формированию цифровых подписей, проверке подписей, а так же шифрованию и дешифрованию данных.

Обмен с онлайн кассами, биткоины – часто встречающиеся в моей практике темы для разработки, в которых используется шифрование передаваемых данных. В моем случае, под шифрованием я подразумеваю в т.ч. формирование электронной цифровой подписи с последующей валидацией.

 

 Юридическая информация

Когда мне была поставлена задача реализовать подписание ЭЦП по алгоритму SHA256-rca паддинг pkcs1 с ключами 2048 я решил, что сделаю все в 3 строки кода:

Хэш=Новый ХешированиеДанных(ХешФункция.SHA256);
Хэш.Добавить("Тра ля ля");
Сообщить(Хэш.ХешСумма);

Как выяснилось почти сразу, кроме этих магический строк в платформу встроены еще пара других алгоритмов получения хэшей и все.

Но где же RSA? А ключи? Короче ждал меня облом.

Можно задействовать внешний криптопровайдер, но это стоит денег, да и сервер на котором все должно работать находится в Америке и там же админится, дадут ли устанавливать лишний софт – большой вопрос.

Поиски в интернете готового решения не дали, пришлось садиться в студию и кодить компоненту net.

Для запуска компоненты используется C++ компонента NETLoader, скачанная с инфостарта.

В архивах к публикации можно найти демо-обработку, реализующую логику шифрования/дешифрования, создания и проверки цифровой подписи, и компоненты отдельно.

Все процедуры выполняются в один поток и на больших данных могут подвисать. Но на практике мне такое не встретилось.

В этом видео показано как все работает:

Для тестирования методов компоненты (без учета особенностей работы платформы 1с) реализовано Windows приложение (см в архиве WindowsFormsTest1.exe). Компонента адаптирована для работы как с платформой 1с, так и как самостоятельного решения для использования в других задачах. Требования – net.3.5. Тестирование производилось на платформе 8.3.12 на управляемом интерфейсе в контексте сервера. Компонента реализует:
подписание по алгоритму SHA-256 с шифрованием хеша подписи по алгоритму RCA PKCS1 при помощи, ключей размером 2048
проверку (валидацию) подписи
шифрование и дешифровку данных по алгоритму
RSA PKCS1 про помощи ключей, размером 2048
В 1с компоненту можно задействовать при помощи служебной компоненты netloader.dll (встроена в фреймворк).
 

 Описание методов компоненты CoderEncoder.dll

Создание ключей шифрования
Назначение: создает новые ключи шифрования
Имя метода: GetKeysInXML(string randomstring)
Параметры: randomstring (произвольная строка, обязательный параметр) – не используется, остался в наследие от первой версии компоненты.
Возвращаемое значение: Истина или Ложь.
Приватный и публичный ключ можно получить, обратившись к свойствам компоненты publicKey и privateKey
Значения ключей представлены в формате XML, поля которого содержат двоичные данные в формате base64

Формирование цифровой подписи
Назначение: формирует цифровую подпись переданных данных
Имя метода: SignData(string DataToSign, string privateKey)
Параметры: DataToSign (строка) – данные, которые необходимо подписать; privateKey (строка) – приватный ключ в формате XML.
Возвращаемое значение: Истина или Ложь
Значение подписи можно получить, обратившись к свойству компоненты Base64SignedHash
Значение – это двоичные данные в формате base64

Проверка цифровой подписи
Назначение: возвращает результат проверки цифровой подписи
Имя метода: VerifySignature(string DataToSign, string signature, string publicKey)
Параметры: DataToSign (строка) – данные, которые необходимо подписать; signature (строка) – цифровая подпись в формате base64; privateKey (строка) – приватный ключ в формате XML.
Возвращаемое значение: Истина или Ложь
Если подпись прошла проверку – возвращает Истина

Шифрование данных
Назначение: шифровка данных
Имя метода: EncryptData(string originalMessage, string publicKey)
Параметры:  originalMessage (строка) – данные, которые необходимо зашифровать; publicKey (строка) – публичный ключ в формате XML.
Возвращаемое значение: Истина или Ложь
Результат шифрования можно прочитать из свойства encripteddata

Дешифрование данных
Назначение: дешифровка данных
Имя метода: DecryptData(string originalMessage, string privateKey)
Параметры:  originalMessage (строка) – данные, которые необходимо расшифровать; privateKey (строка) – приватный ключ в формате XML. Возвращаемое значение: Истина или Ложь
Возвращаемое значение: Истина или Ложь
Результат шифрования можно прочитать из свойства decripteddata;

Обработка ошибок
Если методы компоненты возвращают Ложь, возможно, в передаваемых параметрах допущены ошибки. Получить описание последней ошибки можно обратившись к свойству компоненты lasterror (строка)

 

58 Comments

  1. saa@kuzov.org

    Спасибо за исходники!

    Это большая редкость, когда автор не просто выкладывает бинарник (с х.з. каким кодом внутри), а дает возможность самому проверить код и собрать его.

    У меня вопрос. Я вообще не владею .Net, и не люблю его (исторически сложилось).

    Насколько проще/сложнее писать Native ВК для 1С на .Net, нежели на расово верном C++ (или хотя бы Dephi)?

    Reply
  2. Steelvan

    Если сервера в Америке, то это будет самый большой риск для предпринимателя.

    Заблокируют и будут шантажировать.

    Reply
  3. astracrypt

    (1) Респект и уважуха автору.

    Reply
  4. astracrypt

    (2) Это тебе не Раша, там уважают закон, никто без решения конгреса или постановления суда не будет тебя шантожировать.

    Reply
  5. Nikola23

    (1) пишите на чем можете. Вопрос «что проще» не считаю правильным.

    Reply
  6. Steelvan

    (3) Подотрите сопли, перестаньте верить в бабкины сказки и выучите правила грамматики русского языка.

    И посмотри другие источники информации об Америке, кроме фильмов о супергероях.

    Reply
  7. echo77

    (0) Классно!

    Только поправьте заголовок на RSA-SHA256, а то поиском не ищется.

    Reply
  8. uno-c

    У меня криптопровайдер вшит в Windows, думаю у буржуев то же самое. Вот рабочий пример подписи RSA-SHA256 с его помощью на 1С. Закрытый ключ хранится в макете в виде xml, вспомогательные функции SafeИзДвоичных, ДвоичныеИзSafe и т.п. не привожу — понятно что они делают. Только что проверил — все работает, подпись рассчитывает, конечного получателя эта подпись устраивает.

    Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
    Хеширование.Добавить(JWTдляСигнатуры);
    Хеш = Хеширование.ХешСумма;
    
    ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);
    ХМЛСертификатСЗакрытымКлючом = ОбработкаОбъект.ПолучитьМакет(«Макет»);
    ХМЛТекст = ПолучитьСтрокуИзДвоичныхДанных(ХМЛСертификатСЗакрытымКлючом);
    КрПровайдер = Новый COMОбъект(«System.Security.Cryptography.RSACryptoServiceProvider»);
    КрПровайдер.FromXmlString(ХМЛТекст);
    
    SafeArrayBinХешДляПодписи = SafeИзДвоичных(Хеш);
    SafeArrayBinПодписьДвоичная = КрПровайдер.SignHash(SafeArrayBinХешДляПодписи, «SHA256»);
    ПодписьДвоичная = ДвоичныеИзSafe(SafeArrayBinПодписьДвоичная);
    

    Показать

    Reply
  9. Nikola23

    (8) Раз за Вас. Спасибо за пример, может быть сообществу пригодится.

    Reply
  10. uno-c

    (9) Похоже, в статье вот это в заблуждение вводит:

    Можно задействовать внешний криптопровайдер, но это стоит денег, да и сервер на котором все должно работать находится в Америке и там же админится, дадут ли устанавливать лишний софт – большой вопрос.

    Криптопровайдер внешний не нужен, работает виндовский, без дополнительной оплаты.

    Reply
  11. uno-c

    (9) Более того, используемый Вами дотнет обращается к этому же виндовскому криптопровайдеру. Вы ведь в коде исходников не возводите хеш в степень закрытого ключа по модулю открытого ключа?

    Reply
  12. spacecraft

    (11)

    Более того, используемый Вами дотнет обращается к этому же виндовскому криптопровайдеру

    этот «виндовский криптопровайдер» не встроен в видну. Это библиотека того самого «дотнет» framework.

    (10)

    Криптопровайдер внешний не нужен, работает виндовский, без дополнительной оплаты.

    Для приведенного примера да, не нужен. Намного интересней, когда понадобится использовать гостовский криптопровайдер.

    Reply
  13. uno-c

    дубль (14)

    Reply
  14. uno-c

    (12)Во-первых, сам дотнет встроен в винду. Во-вторых, крипропровайдеры встроены в винду помимо дотнета. В третьих, в случае с RSA-SHA256 дотнет работает как оболочка для неуправляемого кода Microsoft Cryptography API (CryptoAPI), т.е. сам ничего не рассчитывает, а обращается API виндовского криптопровайдера, т.е. по сути делает то же самое, что я написал в коде 1С. Если в винде не будет нужного криптопровайдера — дотнет ничего не сможет с RSA-SHA256. А вот для случая с эллиптическими кривыми (например у ГОСТ такое) — там как раз да, дотнет сам все умеет вычислять в управляемом коде без обращения к CSP, т.е. по идее дотнету не нужен КриптоПро, хотя я так не пробовал, использовал cadescom.dll КриптоПрошный из 1С, он насколько помню бесплатный.

    Reply
  15. spacecraft

    (14)

    Во-первых, сам дотнет встроен в винду.

    Спорное утверждение. С точки зрения использования актуальной версии, ее приходится устанавливать как отдельное приложение.

    (14)

    В третьих, в случае с RSA-SHA256 дотнет работает как оболочка для неуправляемого кода Microsoft Cryptography API (CryptoAPI), т.е. сам ничего не рассчитывает, а обращается API виндовского криптопровайдера, т.е. по сути делает то же самое, что я написал в коде 1С. Если в винде не будет нужного криптопровайдера — дотнет ничего не сможет с RSA-SHA256.

    Это в корне не верно. CryptoAPI это интерфейс, который как содержит свою реализацию криптопровайдера, так и может использовать сторонний. В данном случае System.Security.Cryptography.RSACryptoServiceProvider это сторонний криптопровайдер, который реализует интерфейс CryptoAPI. Т.е. это через CryptoAPI можно использовать криптопровайдер «дотнет».

    Reply
  16. uno-c

    (15)

    С точки зрения использования актуальной версии, ее приходится устанавливать как отдельное приложение

    Это как раз недостаток Вашего метода, поэтому метод напоминает причину отказа от операции Афенбаха из горячих голов.

    Это в корне не верно

    Читайте доки и смотрите свой код. «К именам неуправляемых реализаций обычно добавляется суффикс «CryptoServiceProvider» (скажем, SHA1CryptoServiceProvider), указывающий на то, что данная реализация на самом деле предоставляется криптопровайдером (Cryptographic Service Provider, CSP), который установлен на уровне операционной системы и действует как оболочка CryptoAPI. В имена управляемых реализаций включается суффикс «Managed» (например SHA1Managed). Такие реализации не опираются на CryptoAPI и содержат исключительно управляемый код.» Ну и как Вас, Managed? ))

    Reply
  17. spacecraft

    (16) вы что-то попутали. Не я автор темы и никакого кода не выкладывал.

    Reply
  18. spacecraft

    (16) вы в самом деле не понимаете, что сами же в своем коде из 1С вызываете класс из библиотеки «дотнет»?

    https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.rsacryptoserviceprovider?view=netcore-2.0

    Reply
  19. uno-c

    (18)Похоже, Вы смотрите и не видите. Написано же, «предоставляемого поставщиком служб шифрования (CSP)» — т.е. дотнету нужен внешний криптопровайдер. В данном конкретном случае будет использоваться криптопровайдер винды по умолчанию — Microsoft Enhanced Cryptographic Provider или Microsoft Strong Cryptographic Provider. И где Вы в моих постах нашли утверждение, что мой код не использует класс дотнета? Я утверждал, что дотнет встроен в винду, криптопровайдер встроен в винду, и в данном случае дотнет использует бесплатный виндовский криптопровайдер. Это относилось к фразе автора

    Можно задействовать внешний криптопровайдер, но это стоит денег
    Reply
  20. spacecraft

    (19) как это объясняет, что вы сами используете этот класс из 1С? «т.е. по сути делает то же самое, что я написал в коде 1С.» По сути вы просто вызываете этот класс.

    Reply
  21. uno-c

    (20)Моему вызову не нужна конкретная версия дотнета, в отличие от разработки автора, если правильно понял Ваш вопрос. Я говорил платном криптопровайдере, который не нужен для RSA-SHA256, потому что встроен в винду и вызывается из дотнета.

    Reply
  22. spacecraft

    (21) тогда произошло недопонимание всех. Автор так же не использовал платный криптопровайдер, а воспользовался этим же встроенным классом из дотнет, только через ВК.

    Reply
  23. spacecraft

    (21) по сути, ваше решение подходит только для windows.

    Решение с ВК может работать и на unix. Не знаю как сделано у автора, но теоретически это возможно.

    Соответственно нужно использовать класс «System.Security.Cryptography.Algorithms».

    Reply
  24. uno-c

    (22)а этот класс ничего не умеет кроме как обратиться к встроенному в винду Microsoft Enhanced Cryptographic Provider. Этот класс — просто обертка. В win-XP можно было достучаться к этому же криптопровайдеру через CAPICOM.

    Reply
  25. uno-c

    (23)Похоже, что автор написал dll на управляемом коде и запускает ее с помощью native компоненты https://infostart.ru/public/300091/ Последняя сделана только для windows судя по описанию. Вот такой длинный путь вместо прямого обращения из кода 1С, как я предполагаю.

    Reply
  26. Nikola23

    (25) Что за холивар устроили Вы тут?

    Компонента решает намного больше задач, чем просто создание цифровой подписи.

    Но самое главное — не это. Полный интернет примеров кода, на всех языках, кроме 1с) Потому, какой пример (работающий) нашел, на том языке и скомпилил.

    Напишите на 1с шифрование данных этим же алгоритмом. Уверен, сообществу будет благодарно.

    Главное — не язык или технология, а решение задачи заказчика в рамках бюджета и сроков с приемлемым уровнем качества.

    Reply
  27. uno-c

    (26)Вам предложен более лаконичный способ решения Вашей задачи

    реализовать подписание ЭЦП по алгоритму SHA256-rca

    Плюс неплохо и пояснить spacecraft в чем он заблуждается, вдруг где пригодится. При чем тут холивар? Обратное тоже работает — spacecraft открывает для читающих что-то новое.

    Reply
  28. Nikola23

    (27) Предложен — ок, я поблагодарил сразу.

    Только я не просил.

    Оформите свои знания отдельной публикацией — сообщество поблагодарит…

    Reply
  29. uno-c

    (28)Ваша просьба не обязательна. Нашедший Ваше решение и прочитавший комментарии к нему увидит, что оно не оптимально. На отдельную статью приведенный мной способ сделать подпись RSA-SHA256 не тянет — в принципе в тех строчках кода, что я привел, и есть решение задачи, поставленной в начале Вашей статьи. Вот еще строчка — вариант проверки действительности цифровой подписи.

    ПодписьВерна = КрПровайдер.VerifyHash (SafeArrayBinХешДляПодписи, «SHA256», SafeArrayBinПодписьДвоичная);

    Асимметричное шифрование RSA — неактуально для 1С, но если будет нужно — принцип тот же.

    Reply
  30. Nikola23

    (29) По какому критерию оптимальность считаете?

    Reply
  31. uno-c

    (30) Эффективность по Парето. В данном случае выражается как «чем проще — тем лучше» при одинаковой функциональности. Хотя нет, функциональность в предложенном мной способе получше будет — нет завязки на версию дотнета. Ваше решение на win-10 потребует установки третьей версии дотнета.

    Reply
  32. Nikola23

    (31) Ваши утверждения высосаны из воздуха, что бы ваша позиция была подтверждена хоть чем-то. Конкретных цифр не предоставлено, да и вряд ли возможно, потому как Ваше решение — только куча слови и 3 строчки кода, на практике не проверялось. Не спорю, работать будет.

    Лучшее решение — это то, которое решает задачу заказчика, в приемлемый срок с приемлемым качеством в рамках бюджета.

    Коллега, уже не раз пишу, что функционал компоненты выходит за рамки создания ЭЦП. Почитайте описание хотя бы.

    Reply
  33. uno-c

    (32)Мое утверждение проверялось на Тинкофбанке при выдаче займов по схеме МФО, а также на 2LO авторизации Google API. Из двух решений, делающих одно и то же, лучшее то, которое менее требовательно к среде выполнения. Вы суть моего решения не поняли — делаете все то же самое, что у Вас написано и скомпилировано в dll, но делаете это напрямую из кода 1С, что подпись, что шифрование. И никаких dll и NETLoader при этом не нужно, работает на винде от 7 до 10 без запроса 3.5 дотнета — это из проверенного. На XP-sp3 тоже будет работать, если дотнет 35 поставить, на ранних XP даже с дотнетом 3.5 не работает, т.к. дотнет обращается к виндовому криптопровайдеру, а он в раньше не умел SHA256RSA. Добавлю из неочевидного к приведенному мной коду:

    COMSafeArray = Новый COMSafeArray(«VT_UI1», Байтов);//однобайтовый без знака

    Он используется при передаче двоичных данных между эской и криптопровайдером.

    Reply
  34. Nikola23

    (33) Прошу за меня не решать, что я понял, а что нет.

    Вы молодец, предлагаю перестать тешить свое ЧСВ, а сделать свои знания достоянием сообщества.

    Reply
  35. uno-c

    (34)Если кому-то нужно больше чем я написал, для решения задач подобной Вашей, без использования двух дополнительных dll-ок и без завязки на версию дотнет — вэлкам. Или помогу или действительно статью напишу. Что Вы поняли что нет — это не мое решение, а вывод из Ваших слов

    Ваши утверждения высосаны из воздуха

    Либо это из-за непонимания, либо еще хуже )

    Reply
  36. uno-c

    (1)

    Насколько проще/сложнее писать Native ВК для 1С на .Net, нежели на расово верном C++

    На дотнете невозможно написать внешнюю компоненту для 1С по технологии Native.

    Reply
  37. Nikola23

    (36) Это является проблемой, только если Native — обязательно.

    В моих задачах такого не встречал.

    Reply
  38. uno-c

    (37) Согласен. Но правильный ответ на конкретный вопрос «Насколько проще/сложнее писать Native ВК для 1С на .Net, нежели …» звучит так: бесконечно сложнее, поскольку невозможно )

    Reply
  39. spacecraft

    (36)

    На дотнете невозможно написать внешнюю компоненту для 1С по технологии Native.

    «Да-да, конечно». Для некоторых это и правда невозможно.

    https://habr.com/post/304542/?hl=ru_RU&fl=ru%2Cen

    Reply
  40. uno-c

    (39)Опять Вы невнимательны. В прошлый раз не заметили, что дотнет вызывает встроенного в ОС криптопровайдера, теперь не заметили, что в приведенном Вами примере по технологии Native на C++ написан враппер для классов дотнета. Т.е. для запуска скомпилированной дотнет dll-ки в приведенном примере нужна дополнительная компонента на неуправляемом коде, назвается она Native ВК. Но дотнетовская dll при этом не становится Native для 1С и без Native-прослойки на C++ не работает. Псевдокод в dll дотнета по определению не может быть внешней Native компонентой для 1С. Native должна быть написана на машинном коде.

    Reply
  41. spacecraft

    (40) вам шашечки или ехать? .NET библиотеки можно использовать в ВК Native.

    Псевдокод в dll дотнета по определению не может быть внешней Native компонентой для 1С. Native должна быть написана на машинном коде.

    С таким же успехом можно сказать, что любая программа на .NET не является программой, так как не написана на машинном коде.

    Reply
  42. uno-c

    (41)Тут да, вопрос терминологии. Любая программа на дотнете действительно не является исполняемой программой по определению. В практической плоскости это означает, что не получится скомпилировать дотнет-dll-ку для 1С , вставить ее в 1С в какой-нибудь двоичный макет, и запустить на паре-тройке других win-компьютеров без костылей. Например, в приведенном Вами примере автор предлагает для запуска тестовой dll-ки размером 70 килобайт — скачать и разместить в каталоге дополнительную многомегабайтную библиотеку.

    Reply
  43. uno-c

    (41)В чем вообще фишка Вашего примера? Предлагается взять скомпилированную на С++ AddInNetObjectToNative.dll — которая действительно является Native компонентой, туда же рядом скачать и поместить библиотеки NetCore, и только после этого скомпилированная из сишарпа NetObjectToNative.dll заработает. Тут два костыля получается. Это Вы называете созданием ВК по Native технологии для 1С на C#? Но если Вы обратите внимание на код 1С из Вашего примера, то единственная Native-ВК, которая там подключается — это ВК на С++

    Reply
  44. uno-c

    (39)

    «Да-да, конечно». Для некоторых это и правда невозможно.

    https://habr.com/post/304542/?hl=ru_RU&fl=ru%2Cen

    Подытожим для ищущих способ написать на C# внешнюю Native компоненту для 1С. На сишарпе в принципе невозможно скомпилировать dll-ку, которая подключалась бы в 1С методом ПодключитьВнешнююКомпоненту(«ИзСиШарпа.dll», «Имя», ТипВнешнейКомпоненты.Native). NativeВК из статьи по ссылке spacecraft-а написана на C++, в этом можно убедиться, если прочитать приведенную статью, обратить внимание на строки из нее

    ИмяФайла=КаталогОтчета+»AddInNetObjectToNative.dll»;
    ПодключитьВнешнююКомпоненту(ИмяФайла, «NetObjectToNative»,ТипВнешнейКомпоненты.Native); 

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

    Reply
  45. Nikola23

    (44) Коллега, в чем суть вашего участия в обсуждении и того, как много времени вы тратите на доказывание своей правоты?

    Мне вот все равно, правы Вы или нет. Просто интересно стало: у Вас много лишнего времени? Потратьте его на семью…

    П,С, пока вы строчите комментарии я решаю задачи, пусть и не идеальным/оптимальным методом — я уже перерос юношеский максимализм.

    С# использую, потому что знаю. С++ не знаю, учить не хочу, даже если на основы достаточно потратить 1 день.

    Reply
  46. uno-c

    (45)Искал когда-то сам ответы на эти вопросы, быстро не нашел, пополняю интернет правильными ответами. Жаль, что их портят некомпенетнтыми возражениями, но если польза будет возражающему, тогда не жаль. Пока Вы решаете чужие задачи, я занимаюсь чем хочу.

    Reply
  47. uno-c

    (45)А Вы скажите, в чем смысл шифрования в 1С с использованием двух костылей: C++ внешней компоненты плюс C# dll-ки? Именно шифрования, не подписи sha256rsa. Менеджер криптографии эсочный с шифрованием не справился?

    Reply
  48. uno-c

    (45)

    С# использую, потому что знаю. С++ не знаю, учить не хочу, даже если на основы достаточно потратить 1 день.

    Вы зря восприняли мою реплику про С++ в свой адрес. Она была предназначена для вопрошающего, который думал, что на языках дотнета можно написать NativeВК.

    Reply
  49. uno-c

    (41)

    вам шашечки или ехать? .NET библиотеки можно использовать в ВК Native.

    Только понял. Вы просто не уловили, о чем спрашивал saa@kuzov.org, когда писал «Насколько проще/сложнее писать Native ВК для 1С на .Net, нежели на расово верном C++ (или хотя бы Dephi)?» Если перефразировать — то он спрашивал «насколько сложнее написать Native на C#, чем на C++» или «насколько сложнее на Delphi чем на Visual Basic .NET», на это был мой ответ, который можно перефразировать «на языках дотнета написать Native невозможно». То, что библиотеки дотнета можно использовать через Native ВК, очевидно уже из разработки Nikola23, в рамках которой идет наше обсуждение. Но для этого, как и в Вашем примере, в эску сначала подключается Native на неуправляемом коде.

    Reply
  50. stash_84

    (13) В связи с тем, что внутренние сообщения не работают, хотел бы тут обратиться к Вам — не могли бы Вы пояснить о своём решении, основанном на штатном криптопровайдере ОС?

    Reply
  51. Nikola23

    (50) Что именно пояснить?

    Reply
  52. stash_84

    (51) вопрос был неверным — работа с криптографией средствами Крипто Про.

    Reply
  53. Nikola23

    (52) В этой компоненте крипто про не поддерживается. У крипто про есть свои методы.

    Reply
  54. stash_84

    (53) по этим методам есть подобные статьи или только на сайте «Крипто Про» необходимо брать документацию и разбираться?

    Reply
  55. Nikola23

    (54) Этот вопрос я не разбирал. Поэтому Вам надо самому разбираться. В т.ч. с поиском документации.

    Reply
  56. geniusan

    (35) Плюсую, сделал также для SHA512RSA. Пришлось сделать программку небольшую на C#, которая приватный ключ переводит из pfx в xml. Хранить его не очень безопасно получается в макете, пока сохранил в безопасном хранилище (от БСП), убрав все права у всех ролей, и сделав получение через привилегированный режим, но все равно — это ненадежно. В идеале бы найти способ, как можно средствами 1С, сертификат хранимый в хранилище сертификатов получить в xml, или как из него инициализировать RSACryptoServiceProvider.

    Пример получения ЭЦП в base64:

    PrivateKey    = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(«PrivateKey»);
    ОбъектШифрования = Новый COMОбъект(«System.Security.Cryptography.RSACryptoServiceProvider»);
    ОбъектШифрования.FromXmlString(PrivateKey);
    
    ВходнаяСтрока  = «Test string»;
    UTF8Encoding  = Новый COMОбъект(«System.Text.UTF8Encoding»);
    ДаныеБинарные  = UTF8Encoding.GetBytes_4(ВходнаяСтрока);
    
    //Получаем подпись
    BinaryЭЦП  = ОбъектШифрования.SignData_2(ДаныеБинарные, «2.16.840.1.101.3.4.2.3»); //SHA512RSA OUT:ComSafeArray
    ЭЦП    = BinaryЭЦП.Выгрузить(); //ComSafeArray -> Массив
    Размер   = ЭЦП.Количество();
    Буфер   = Новый БуферДвоичныхДанных(Размер); //Массив -> БуферДвоичныхДанных
    Для Н = 0 По Размер — 1 Цикл
    Буфер[Н] = ЭЦП[Н];
    КонецЦикла;
    ВыходнаяСтрока = ПолучитьBase64СтрокуИзБуфераДвоичныхДанных(Буфер);// БуферДвоичныхДанных -> Base64 String
    Сообщить(СтрЗаменить(ВыходнаяСтрока, Символ(13) + Символ(10), «»));
    

    Показать

    Reply
  57. uno-c

    (56)Для перевода pfx в xml можно запустить PowerShell и скопипастить в него подобный скрипт:

    $cert = New-Object system.security.cryptography.x509certificates.x509certificate2
    $pat=»d:UNSAFEdelPrivateKey.pfx»
    $password=»123″
    $flags = «UserKeySet,Exportable»
    $cert.Import($pat, $password, $flags)
    $myXml = $cert.PrivateKey.ToXmlString($True)
    $myXml | Out-File «d:UNSAFEdelPrivateKey.xml»
    

    Если Enter после последней строки не подхватите при копировании — дополнительно нажмите Enter в PowerShell

    Для безопасного хранения закрытого ключа xml — можно зашифровать его средствами 1С:

     //шифруем ХМЛ
    МенеджерКриптографии = Новый МенеджерКриптографии(«Microsoft Enhanced Cryptographic Provider v1.0″,»»,1);
    ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
    Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ПолучитьДвоичныеДанныеИзHexСтроки(«908407f45198d4dd3a544c16d6b1a0cac85340cd»));
    ДвоичныеКлючаХМЛ = Новый ДвоичныеДанные(«d:UNSAFEdelPrivateKey.xml»);
    ДвоичныеЗашифрованногоХМЛ = МенеджерКриптографии.Зашифровать(ДвоичныеКлючаХМЛ, Сертификат);
    СтрокаЗашифрованныеХМЛ = Base64Строка(ДвоичныеЗашифрованногоХМЛ);
    
    //расшифровываем ХМЛ
    //МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = «123»;
    ДвоичныеЗашифрованногоХМЛ = Base64Значение(СтрокаЗашифрованныеХМЛ);
    ДвоичныеРасшифрованы = МенеджерКриптографии.Расшифровать(ДвоичныеЗашифрованногоХМЛ);
    СтрокаХМЛ = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеРасшифрованы);
    Сообщить(СтрокаХМЛ);
    

    Показать

    Reply
  58. geniusan

    (57) Потрясающий ход 🙂 Добавлю, пожалуй, шифрование/расшифровывание всего безопасного хранилища одним сертификатом. Не удивлюсь, если в БСП это тоже скоро допилят. Спасибо!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *