Шифрование строковых данных. Менеджер криптографии.

Просмотр криптопровайдеров ОС Windows. Инициализация менеджера криптографии.
Шифрование строковых данных с помощью CAPICOM.EnvelopedData
Шифрование строковых данных с помощью CAPICOM.EncryptedData

Шифрование - обратимое преобразование некой информации с целью сокрытия от неавторизованных лиц и, в это же время, предоставление, авторизованным пользователям доступа к ней. Главная задача шифрования - это соблюдение конфиденциальности передаваемой информации.

Методы шифрования:
  • Симметричное шифрование - использует один и тот же ключ и для зашифрования, и для расшифрования;
  • Асимметричное шифрование - использует два разных ключа: один для зашифрования (который также называется открытым), другой для расшифрования (называется закрытым).
Объект МенеджерКриптографии платформы 1С позволяет шифровать данные, используя симметричное шифрование, так как криптопровайдеры ОС Windows используют данный вид шифрования (RC2, RC4).

Создание временного сертификата


Для использования шифрования необходимо иметь сертификат. Создание сертификата описано в статье Создание временного сертификата для использования во время разработки. Сертификат необходимо создавать с параметром -sky exchange, иначе расшифрование сообщения будет завершаться ошибкой "Модуль криптографии не поддерживает установку пароля к закрытому ключу".
1. Ошибка установки пароля к закрытому ключу
Так же желательно создавать сертификат с параметром -sp, который позволит задать имя криптопровайдера для сертификата, например, "Microsoft Strong Cryptographic Provider", так как для инициализации объекта МенеджерКриптографии требуется в конструкторе указывать имя криптопровайдера (имя модуля провайдера).

Пример создания временного сертификата для тестирования шифрования в 1С:
makecert.exe -r -pe -n CN="www.example.com" -ss my -sr currentuser
-sky exchange -sp "Microsoft Strong Cryptographic Provider"

2. Создание временного сертификата
Внимание: пароль на контейнер закрытого ключа при создании сертификата в данном случае не устанавливается!

Реализация шифрования


Функция шифрования строковых данных:
// Функция выполняет шифрование строковых данных.
//
// Параметры
//  СтроковыеДанные  - Строка - данные для шифрования;
//  Отпечаток  - Строка - отпечаток сертификата закодированный в Base64;
//  ИмяКП  - Строка - имя модкля криптографии;
//  ТипКП  - Строка - Тип модуля криптографии.
//
// Возвращаемое значение:
//   Строка   - зашифрованный данные формата PKCS#7 закодированные в Base64.
//
&НаКлиенте
Функция ЗашифроватьСтроку(СтроковыеДанные, Отпечаток, ИмяКП, ТипКП)

ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, "CESU-8");
ЗаписьТекста.Записать(СтроковыеДанные);
ЗаписьТекста.Закрыть();

МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП);
ХранилищеСертификатов = МенеджерКриптографии.ПолучитьХранилищеСертификатов(
ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты,
РасположениеХранилищаСертификатовКриптографии.ДанныеПользователяОС);
Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(Base64Значение(Отпечаток));

ЗашифрованныеДанные = МенеджерКриптографии.Зашифровать(ИмяВременногоФайла, Сертификат);

УдалитьФайлы(ИмяВременногоФайла);

Возврат Base64Строка(ЗашифрованныеДанные);

КонецФункции // ЗашифроватьСтроку()


В данной функции строковые данные записываются в файл в кодировке CESU-8, т.е. UTF-8 без BOM. Инициализируется менеджер криптографии и по отпечатку происходит поиск сертификата в хранилище сертификатов текущего пользователя в ветке Личное.
3. Личные сертификаты текущего пользователя
Далее происходит шифрование строковых данных, используя найденный сертификат, тем самым, расшифрование сможет произвести тот пользователь, который имеет доступ к закрытому ключу этого сертификата. Результатом шифрования являются двоичные данные, которые кодируются в строку Base64. Двоичные данные имеют формат PKCS#7.

Функция расшифрования строковых данных:
// Функция выполняет расшифровку строковых данных.
//
// Параметры
//  ЗашифрованныеДанные  - Строка - зашифрованный данные формата PKCS#7 закодированные в Base64;
//  Отпечаток  - Строка - отпечаток сертификата закодированный в Base64;
//  ПарольЗакрытогоКлюча  - Строка - пароль к контейнеру закрытого ключа;
//  ИмяКП  - Строка - имя модкля криптографии;
//  ТипКП  - Строка - Тип модуля криптографии.
//
// Возвращаемое значение:
//   Строка   - расшифрованные строковые данные.
//
&НаКлиенте
Функция РасшифроватьСтроку(ЗашифрованныеДанные, Отпечаток, ПарольЗакрытогоКлюча, ИмяКП, ТипКП)

МенеджерКриптографии = Новый МенеджерКриптографии(ИмяКП, "", ТипКП);
МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ПарольЗакрытогоКлюча;

РасшифрованныеДанные = МенеджерКриптографии.Расшифровать(Base64Значение(ЗашифрованныеДанные));

ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
РасшифрованныеДанные.Записать(ИмяВременногоФайла);
ЧтениеТекста = Новый ЧтениеТекста(ИмяВременногоФайла, "CESU-8");
СтрокаДанных = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();

УдалитьФайлы(ИмяВременногоФайла);

Возврат СтрокаДанных;

КонецФункции // РасшифроватьСтроку()


В данной функции инициализируется менеджер криптографии и указывается пароль к контейнеру закрытого ключа. Далее происходит расшифровка зашифрованных данных. Результатом расшифрования являются двоичные данные, которые записываются в файл с кодировкой CESU-8 и считываются из него.

Скачать обработку шифрования/расшифрования строковых данных можно по этой ссылке.

Пример работы обработки:
4. Шифрование и расшифрование сообщения
На рисунке 4 поле "Пароль" пустое, так как при создании временного сертификата мы не указывали пароль на контейнер закрытого ключа.

Комментарии

  1. Добра!
    А можете сделать что то подобное на заказ?

    ОтветитьУдалить
  2. Почему пароль на закрытый ключ не устанавливается?

    ОтветитьУдалить

Отправить комментарий