crypt_signature

Creator: coderz1093

Last updated:

0 purchases

crypt_signature Image
crypt_signature Images

Languages

Categories

Add to Cart

Description:

crypt signature

Плагин Flutter для формирования электронной цифровой подписи с помощью алгоритмов ГОСТ по стандарту PKCS7 Cryptographic Message Syntax (CMS) #

⚠ Рекомендуется работать через GitHub из-за ограничения по размеру в pub.dev для плагинов в 100 МБ (не хватает места для нативных SDK КриптоПро). Также, там есть эти библиотеки, требуемые в инструкции по установке (если работать с pub.dev).

crypt_signature:
git:
url: https://github.com/MaximMonakhov/crypt_signature.git
ref: v5.4.0-github
copied to clipboard
Описание #
Плагин принимает сертификаты в формате PKCS12 .pfx
Поддерживаемые алгоритмы для Android: GOST R 34.10-2001, GOST R 34.10-2012, GOST R 34.10-2012 Strong
Поддерживаемые архитектуры для Android: arm64-v8a, armeabi-v7a
Поддерживаемые алгоритмы для iOS: GOST R 34.10-2012

⚠ Приватный ключ должен быть помечен как экспортируемый

Установка #
Подключение плагина к Android проекту #


Скопировать .aar библиотеки из android/libs плагина к себе в проект в android\app\libs


Добавить в build.gradle


minSdkVersion 24

buildTypes {
release {
shrinkResources false
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}

dependencies {
implementation fileTree(dir: 'libs', include: '*.aar')
}
copied to clipboard

Создать файл proguard-rules.pro в android/app

-keep public class ru.CryptoPro.*
copied to clipboard
Библиотеки .aar указаны в плагине как compile-only, так как невозможно к .aar (коим является этот плагин) подключать другие .aar, для этого требуется скопировать их к себе в проект и подключить как implementation. Proguard используется, чтобы запретить обфускацию кода, которая происходить при выполнении релизной сборки.
Подключение плагина к iOS проекту #
Добавить папки en.lproj, locale, ru.lproj и файлы kis_1, root.sto, config.ini, license.enc из ios/Resources плагина к себе в проект через Xcode (Add files to Runner...).
Это нужно для того, чтобы эти файлы нашел КриптоПРО для проверки целостности. Это ресурсы копируются в папку с плагином, а КриптоПРО ищет их в корневой папке приложения.
Использование #
Работать с плагином можно:

Используя собственный интерфейс плагина
Через классы по нужному типу подписи (MessageSignRequest, PKCS7MessageSignRequest, ...)
Напрямую через методы

Описание режимов работы:

MessageSignRequest

Высчитывает хэш от сообщения, подписывает его и возвращает сигнатуру в формате Base64.


PKCS7MessageSignRequest

Поддерживает detached/attached форматы PKCS7.


При выборе сертификата пользователем, получает сообщение через функцию getMessage.
Высчитывает хэш от полученного сообщения.
Формирует PKCS7 и атрибуты подписи.
Высчитывает хэш от атрибутов подписи.
Подписывает этот хэш атрибутов.
Вставляет сигнатуру в PKCS7 и возвращает его в формате Base64.


PKCS7HASHSignRequest

Работает как и PKCS7MessageSignRequest, но не высчитывает хэш от первоначального сообщения.
External Digest.
При выборе сертификата пользователем, получает хэш для подписи через функцию getDigest.


CustomSignRequest

Создан для выполнения собственной логики ЭП.



Иными словами. PKCS7MessageSignRequest считает хэш сам, а PKCS7HASHSignRequest получает его готовый извне.
Пример работы режимов:

MessageSignRequest

Применяется, когда у проверяющего есть сертификат пользователя и он хочет только проверить ЭП. Например, аутентификация путем ЭП случайного набора байт.
PKCS7MessageSignRequest

Применяется, когда у проверяющего нет информации о сертификате пользователя и дополнительной информации. Например, регистрация путем ЭП случайного набора байт.
PKCS7HASHSignRequest

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

Использование через интерфейс #
CryptSignature.interface
copied to clipboard
При вызове данного метода открывается экран с возможностью добавления/выбора/хранения сертификатов.

Методы плагина #

Инициализировать провайдер
CryptSignature.initCSP()
copied to clipboard

Установить новую лицензию
CryptSignature.setLicense(String license)
copied to clipboard

Получить информацию о текущей лицензии
CryptSignature.getLicense()
copied to clipboard

Добавить сертификат в хранилище
CryptSignature.addCertificate(File file, String password)
copied to clipboard

Получить список сертификатов, добавленных пользователем
CryptSignature.getCertificates()
copied to clipboard

Очистить список сертификатов
CryptSignature.clear()
copied to clipboard

Вычислить хэш сообщения/документа
CryptSignature.digest(Certificate certificate, String password, String message)
copied to clipboard

Вычислить подпись хэша
CryptSignature.sign(Certificate certificate, String password, String digest)
copied to clipboard


Пример #
Пример использования плагина через интерфейс #
/// MessageSignRequest
CryptSignature crypt = await CryptSignature.getInstance();
SignResult? result = await crypt.interface(context, MessageSignRequest("СООБЩЕНИЕ_В_BASE64"));
print(result?.signature); // Сигнатура в формате Base64
copied to clipboard
/// PKCS7MessageSignRequest
CryptSignature crypt = await CryptSignature.getInstance();
Future<String> getMessage(Certificate certificate) async => message; // Callback для запроса на сервер с выбранным пользователем сертификатом для формирования сообщения
PKCS7SignResult? result = await crypt.interface(context, PKCS7MessageSignRequest(getMessage));
print(result?.pkcs7.encoded); // PKCS7 в формате Base64
copied to clipboard
/// PKCS7HASHSignRequest
CryptSignature crypt = await CryptSignature.getInstance();
Future<String> getDigest(Certificate certificate) async => digest; // Callback для запроса на сервер с выбранным пользователем сертификатом для формирования хэша
PKCS7SignResult? result = await crypt.interface(context, PKCS7HASHSignRequest(getDigest));
print(result?.pkcs7.encoded); // PKCS7 в формате Base64
copied to clipboard
Пример использования плагина через SignRequest #
Рекомендуется, если не пользуетесь интерфейсом. PKCS7SignRequest сам создаст PKCS7 и подпишет его атрибуты подписи.
/// MessageSignRequest
CryptSignature crypt = await CryptSignature.getInstance();
// Получение файла .pfx и запрос пароля
MessageSignRequest request = MessageSignRequest("СООБЩЕНИЕ_В_BASE64");
SignResult result = await request.signer(certificate, password);
print(result.signature); // Сигнатура в формате Base64
copied to clipboard
/// PKCS7MessageSignRequest
CryptSignature crypt = await CryptSignature.getInstance();
// Получение файла .pfx и запрос пароля
Certificate certificate = await crypt.addCertificate(file, password);
Future<String> getMessage(Certificate certificate) async => message; // Callback для запроса на сервер с выбранным пользователем сертификатом для формирования сообщения
PKCS7MessageSignRequest request = PKCS7MessageSignRequest(getMessage);
PKCS7SignResult result = await request.signer(certificate, password);
print(result.pkcs7.encoded); // PKCS7 в формате Base64
copied to clipboard
/// PKCS7HASHSignRequest
CryptSignature crypt = await CryptSignature.getInstance();
// Получение файла .pfx и запрос пароля
Certificate certificate = await crypt.addCertificate(file, password);
Future<String> getDigest(Certificate certificate) async => digest; // Callback для запроса на сервер с выбранным пользователем сертификатом для формирования сообщения
PKCS7HASHSignRequest request = PKCS7HASHSignRequest(getDigest);
PKCS7SignResult result = await request.signer(certificate, password);
print(result.pkcs7.encoded); // PKCS7 в формате Base64
copied to clipboard
Пример использования плагина через методы #
/// Стандартная подпись данных
CryptSignature crypt = await CryptSignature.getInstance();
// Получение файла .pfx и запрос пароля
Certificate certificate = await crypt.addCertificate(file, password);
// Получение сообщения для ЭП
DigestResult digestResult = await crypt.digest(certificate, password, message);
SignResult signResult = await crypt.sign(certificate, password, digestResult.digest);
print(signResult.signature);
copied to clipboard
В случае PKCS7 подписи, PKCS7 нужно будет сформировать самому и подписывать атрибуты подписи. Как пример можно посмотреть как работает Signer в PKCS7MessageSignRequest или PKCS7HASHSignRequest.
Известные проблемы #

Ошибка при вызове encode у PKCS7 второй раз после прикрепления сигнатуры. Возникает из-за того, что пакет ASN1 зачем-то кэширует результат первого кодирования без сигнатуры.
Отсутствует поддержка GOST R 34.10-2001, GOST R 34.10-2012 Strong для iOS

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Files In This Product:

Customer Reviews

There are no reviews.