Как зашифровать строку 1с
Шифрование - обратимое преобразование некой информации с целью сокрытия от неавторизованных лиц и, в это же время, предоставление, авторизованным пользователям доступа к ней. Главная задача шифрования - это соблюдение конфиденциальности передаваемой информации.
- Симметричное шифрование - использует один и тот же ключ и для зашифрования, и для расшифрования;
- Асимметричное шифрование - использует два разных ключа: один для зашифрования (который также называется открытым), другой для расшифрования (называется закрытым).
Создание временного сертификата
Пример создания временного сертификата для тестирования шифрования в 1С:
makecert.exe -r -pe -n CN="www.example.com" -ss my -sr currentuser
-sky exchange -sp "Microsoft Strong Cryptographic Provider"
2. Создание временного сертификата |
Реализация шифрования
МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП);
ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты,
РасположениеХранилищаСертификатовКриптографии.ДанныеПользователяОС);
Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(Base64Значение(Отпечаток));
ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ИмяВременногоФайла, Сертификат);
УдалитьФайлы(ИмяВременногоФайла);
Возврат Base64Строка(ЗашифрованныеДанные);
МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП);
МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ПарольЗакрытогоКлюча;
РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(Base64Значение(ЗашифрованныеДанные));
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
РасшифрованныеДанные.Записать(ИмяВременногоФайла);
ЧтениеТекста = Новый ЧтениеТекста(ИмяВременногоФайла, "CESU-8");
СтрокаДанных = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
УдалитьФайлы(ИмяВременногоФайла);
Возврат СтрокаДанных;
В данной функции инициализируется менеджер криптографии и указывается пароль к контейнеру закрытого ключа. Далее происходит расшифровка зашифрованных данных. Результатом расшифрования являются двоичные данные, которые записываются в файл с кодировкой CESU-8 и считываются из него.
Эта статья описывает готовое решение для выполнения задач по формированию цифровых подписей, проверке подписей, а так же шифрованию и дешифрованию данных.
Обмен с онлайн кассами, биткоины – часто встречающиеся в моей практике темы для разработки, в которых используется шифрование передаваемых данных. В моем случае, под шифрованием я подразумеваю в т.ч. формирование электронной цифровой подписи с последующей валидацией.
Прошу помнить, что разработка средств криптографии регулируется Федеральным Законом "О лицензировании отдельных видов деятельности" а значит требует наличия лицензии, поэтому прежде чем использовать приведенное ниже решение в коммерческих целях прошу ознакомиться законом.
Маленькая оговорка: в действительности лицензирование требуется только в том случае, если вы продаёте программное средство, то есть осуществляете предпринимательскую деятельность. В случае если вы делаете это программное средство для себя и своего предприятия, то это выходит за рамки ФЗ "О лицензировании отдельных видов деятельности" (в следствие отсутствия деятельности как таковой).
Когда мне была поставлена задача реализовать подписание ЭЦП по алгоритму SHA 256- rca паддинг pkcs 1 с ключами 2048 я решил, что сделаю все в 3 строки кода:
Как выяснилось почти сразу, кроме этих магический строк в платформу встроены еще пара других алгоритмов получения хэшей и все.
Но где же 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 (встроена в фреймворк).
Создание ключей шифрования
Назначение: создает новые ключи шифрования
Имя метода: 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 (строка)
Войдите как ученик, чтобы получить доступ к материалам школы
Упражнения по внутреннему языку программирования 1С 8.3: шифры и пароли
Автор упражнений и преподаватель школы: Владимир Милькин
Упражнение №10. Программа читает текстовый файл "c:\in.txt", шифрует (то есть делает совершенно отличным от оригинального) его содержимое и выводит результат в файл "c:\out.txt". Способ шифрования придумайте сами.
Пример текстового файла для шифрования возьмите любой.
Сначала придумайте как будете шифровать строку - тогда сможете легко зашифровать весь текст. Ведь текст - это и есть строка.
Зашифровать строку - значит сделать преобразование каждого из её символов. Преобразование должно быть однозначным, чтобы мы потом смогли сделать обратное преобразование - дешифрование.
Возможно вам понадобятся функции КодСимвола и Символ, которые используется при работе со строками (ссылка).
Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
Для того, чтобы стало возможным использование функций чтения и записи файла в нашей учебной базе выполните следующие инструкции:
1. Нажмите правой кнопкой мыши на элементе "Конфигурация" и выберите пункт "Свойства".
2. Внизу открывшейся справа панели найдите пункт "Режим использования синхронных вызовов. ". Установите его значение в "Использовать".
3. Нажмите на значок дискеты, чтобы сохранить изменения.
Скорее всего вы не сможете создать файл "in.txt" в корне системного диска С (обычно это место имеет защиту от записи новых файлов пользователем). Поэтому выберите себе другой каталог для хранения этого текстового файла и укажите его в программе.
Например, у себя на компьютере я расположил файл "in.txt" на рабочем столе и указал в программе путь до него как "C:\Users\Пользователь\Desktop\in.txt" (у вас этот путь будет другим). Соответственно путь для файла с результатом шифрования я указал как "C:\Users\Пользователь\Desktop\out.txt".
Читаем файл в строку. Бежим по каждому символу этой строки. Узнаём код символа строки, меняем этот код (к примеру, прибавляем к нему число 5), снова превращаем код в символ и прибавляем этот символ (уже шифрованный) к другой строке.
В итоге получаем зашифрованный вариант строки, которую записываем в файл.
При выборе метода шифрования необходимо исходить из правила - «Если стоимость взлома алгоритма выше, чем стоимость зашифрованных данных, вы,
скорее всего, в безопасности»
Брюс Шнайер.
НЕМНОГО ТЕОРИИ
Существует два метода шифрования:
Электронная цифровая подпись (ЭЦП) – это разновидность асимметричного шифрования, когда документ подписывается закрытым ключом, а достоверность документа проверяется открытым.
Хотя в реальности это выглядит несколько сложнее. Хэш-функцией создается хэш документа, который и подписывается закрытым ключом. Далее, эта подпись добавляется к документу.
При проверке подписи, хэш-функцией создается хэш проверяемого документа. Подпись, присоединенная при подписи, дешифруется открытым ключом. Сравниваются два хэша, если они равны, то все в порядке.
Криптопровайдер – из названия понятно, что это набор программных средств управляющих всем, что связанно с криптографией. Создание сертификатов, проверка сертификатов в центрах сертификации, шифрование, дешифрование и пр.
МЕТОДЫ ШИФРОВАНИЯ
В 1С возможны три варианта с помощью которых можно шифровать данные:
- Шифрование методом встроенного объекта «МенеджерКриптографии».
- Шифрование с использованием внешних компонент.
- Шифрование непосредственно в 1С.
ШИФРОВАНИЕ МЕТОДОМ ВСТРОЕННОГО ОБЪЕКТА «МенеджерКриптографии».
Этот метод достаточно подробно описан в Синтакс-Помощнике. Поэтому я опишу только последовательность работы с ним.
Создаем объект МенеджерКриптографии.
Где "Microsoft Enhanced Cryptographic Provider v1.0" и есть тот самый криптопровайдер, а "1" тип который можно посмотреть в реестре.
Дальше еще проще, получаем из менеджера криптографии, хранилище сертификатов. Из хранилища получаем нужный сертификат.
При выборе сертификата лучше использовать серийный номер, так как он короче отпечатка, меньше вероятность ошибки. Поиск по наименованию субъекта необходимо делать с осторожностью, так как при создании нескольких сертификатов одним владельцем, наименования субъекта могут быть одинаковыми.
После того как сертификат получен, зашифровываем, дешифровываем, подписываем, проверяем подпись, в общем делаем все что необходимо.
В интернете имеются реализации, когда сертификат записывают в регистр, а оттуда извлекают их при необходимости. Проблема заключается в том, что все сертификаты имеют срок действия, и к тому же они могут быть перевыпущены в любой момент, в случае, когда закрытые ключи утеряны или скомпрометированы. Эти изменения придется отслеживать вручную.
ШИФРОВАНИЕ НЕПОСРЕДСТВЕННО В 1С
Чаще всего, бывают случаи, когда «танцы с бубнами» вокруг сертификатов абсолютно не нужны. Никто не будет заморачиваться покупкой сертификатов, а создание и отслеживание временных сертификатов, только добавляет «головной боли» программисту. К тому же необходимо всего лишь передать ведомость по зарплате в филиал или в документообороте создать персональную служебную записку.
Для этого можно реализовать достаточно надежный для этих целей алгоритм шифрования на встроенном языке.
Основными ограничениями в этом случае являются отсутствие в 1С методов для работы с двоичными данными и производительность платформы.
Обойти ограничения отсутствия методов двоичного счисления можно применив для работы алгоритма обычную десятичную математику.
С производительностью, к сожалению, ничего сделать нельзя. Все попытки существенно увеличить производительность при шифровании и дешифровании не привели к успеху, натыкаясь на ограничения платформы.
RSA для 1С
С теорией алгоритма RSA можно познакомиться здесь.
Основываясь именно на этом материале был реализован программный код состоящий всего из шести небольших функций.
Алгоритм RSA был разработан еще в 1977 г. В 2003 г. Ади Шамир и Эран Тромер разработали схему устройства TWIRL, которое при стоимости $ 10 000 может дешифровать 512-битный ключ за 10 минут, а при стоимости $ 10 000 000 – 1024-битный ключ меньше, чем за год.
Однако этот алгоритм используется и до настоящего времени с рекомендуемой длинной ключа 2048 бит.
В нашем же случае используется ключ примерно в 14 бит, увеличить длину ключа можно увеличив период диапазона.
Однако значительное увеличение, резко замедляет процесс шифрования и дешифрования.
Читайте также: