Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Виктор Павлович  
#1 Оставлено : 2 ноября 2022 г. 17:57:24(UTC)
Виктор Павлович

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.11.2022(UTC)
Сообщений: 1
Российская Федерация
Откуда: Москва

UPD: Вопрос решен переустановкой плагина и КриптоПРО. Скорость 1 подписи стала 600мс, что уже допустимо.


Добрый день. У меня вопрос по скорости и логике работы плагина, когда от него требуется лишь сформировать подпись для готового хеша. Для работы используется Рутокен ЭЦП 2.0 (с неизвлекаемым ключом). Время создания подписи согласно документации - 300мс.

Я использовал ваш пример "Вычисление подписи по хэш-значению": https://docs.cryptopro.ru/cades/...%d0%b5%d0%bd%d0%b8%d1%8e

Код:
    function CreateSignature(oCertificate, oHashedData) {

        // Создаем объект CAdESCOM.RawSignature
        var oRawSignature = cadesplugin.CreateObject("CAdESCOM.RawSignature");

        // Вычисляем значение подписи
        try {
            const startTime = performance.now();
            var sRawSignature = oRawSignature.SignHash(oHashedData, oCertificate);
            const finishTime = performance.now();
            console.log(`SignHash time: ${finishTime - startTime}ms`);
        } catch (err) {
            alert("Failed to create signature. Error: " + cadesplugin.getLastError(err));
            return;
        }

        return sRawSignature;
    }


Замерил время выполнения функции SignHash. Результат очень разочаровал - 6000мс.

Я продолжил исследования дальше, подменив librtpkcs11ecp.so на библиотеку-шпион из компалекта SDK. По итогу выяснилось, что 1 вызов SignHash тянет за собой вот такую портянку вызовов на Рутокене:
Цитата:
{0xC3D0,0xC3D0}: 0: C_GetFunctionList
{0xC3D0,0xC3D0}: 1: C_Initialize
{0xC3D0,0xC3D0}: 2: C_EX_GetFunctionListExtended
{0xC3D0,0xC3D0}: 3: C_GetSlotList
{0xC3D0,0xC3D0}: 4: C_GetSlotList
{0xC3D0,0xC3D0}: 5: C_GetSlotInfo
{0xC3D0,0xC3D0}: 6: C_GetSlotList
{0xC3D0,0xC3D0}: 7: C_GetSlotList
{0xC3D0,0xC3D0}: 8: C_GetSlotInfo
{0xC3D0,0xC3D0}: 9: C_EX_SlotManage
{0xC3D0,0xC3D0}: 10: C_OpenSession
{0xC3D0,0xC3D0}: 11: C_GetTokenInfo
{0xC3D0,0xC3D0}: 12: C_EX_GetTokenInfoExtended
{0xC3D0,0xC3D0}: 13: C_GetMechanismList
{0xC3D0,0xC3D0}: 14: C_GetMechanismList
{0xC3D0,0xC3D0}: 15: C_GetTokenInfo
{0xC3D0,0xC3D0}: 16: C_EX_GetTokenInfoExtended
{0xC3D0,0xC3D0}: 17: C_FindObjectsInit
{0xC3D0,0xC3D0}: 18: C_FindObjects
{0xC3D0,0xC3D0}: 19: C_FindObjectsFinal
{0xC3D0,0xC3D0}: 20: C_GetAttributeValue
{0xC3D0,0xC3D0}: 21: C_GetAttributeValue
{0xC3D0,0xC3D0}: 22: C_FindObjectsInit
{0xC3D0,0xC3D0}: 23: C_FindObjects
{0xC3D0,0xC3D0}: 24: C_FindObjectsFinal
{0xC3D0,0xC3D0}: 25: C_GetAttributeValue
{0xC3D0,0xC3D0}: 26: C_GetAttributeValue
{0xC3D0,0xC3D0}: 27: C_GetAttributeValue
{0xC3D0,0xC3D0}: 28: C_GetAttributeValue
{0xC3D0,0xC3D0}: 29: C_GetSessionInfo
{0xC3D0,0xC3D0}: 30: C_GetTokenInfo
{0xC3D0,0xC3D0}: 31: C_EX_GetTokenInfoExtended
{0xC3D0,0xC3D0}: 32: C_GetSessionInfo
{0xC3D0,0xC3D0}: 33: C_GetTokenInfo
{0xC3D0,0xC3D0}: 34: C_EX_GetTokenInfoExtended
{0xC3D0,0xC3D0}: 35: C_GetSessionInfo
{0xC3D0,0xC3D0}: 36: C_GetTokenInfo
{0xC3D0,0xC3D0}: 37: C_EX_GetTokenInfoExtended
{0xC3D0,0xC3D0}: 38: C_FindObjectsInit
{0xC3D0,0xC3D0}: 39: C_FindObjects
{0xC3D0,0xC3D0}: 40: C_FindObjectsFinal
{0xC3D0,0xC3D0}: 41: C_GetAttributeValue
{0xC3D0,0xC3D0}: 42: C_GetAttributeValue
{0xC3D0,0xC3D0}: 43: C_FindObjectsInit
{0xC3D0,0xC3D0}: 44: C_FindObjects
{0xC3D0,0xC3D0}: 45: C_FindObjectsFinal
{0xC3D0,0xC3D0}: 46: C_GetAttributeValue
{0xC3D0,0xC3D0}: 47: C_GetAttributeValue
{0xC3D0,0xC3D0}: 48: C_GetAttributeValue
{0xC3D0,0xC3D0}: 49: C_GetAttributeValue
{0xC3D0,0xC3D0}: 50: C_FindObjectsInit
{0xC3D0,0xC3D0}: 51: C_FindObjects
{0xC3D0,0xC3D0}: 52: C_FindObjectsFinal
{0xC3D0,0xC3D0}: 53: C_FindObjectsInit
{0xC3D0,0xC3D0}: 54: C_FindObjects
{0xC3D0,0xC3D0}: 55: C_FindObjectsFinal
{0xC3D0,0xC3D0}: 56: C_GetAttributeValue
{0xC3D0,0xC3D0}: 57: C_GetAttributeValue
{0xC3D0,0xC3D0}: 58: C_GetSessionInfo
{0xC3D0,0xC3D0}: 59: C_GetTokenInfo
{0xC3D0,0xC3D0}: 60: C_EX_GetTokenInfoExtended
{0xC3D0,0xC3D0}: 61: C_Logout
{0xC3D0,0xC3D0}: 62: C_Login
{0xC3D0,0xC3D0}: 63: C_FindObjectsInit
{0xC3D0,0xC3D0}: 64: C_FindObjects
{0xC3D0,0xC3D0}: 65: C_FindObjectsFinal
{0xC3D0,0xC3D0}: 66: C_SignInit
{0xC3D0,0xC3D0}: 67: C_Sign
{0xC3D0,0xC3D0}: 68: C_Sign
{0xC3D0,0xC3D0}: 69: C_CloseSession


Хотел бы теперь задать следующие вопросы:
1. У меня всего 1 сертификат и 1 Рутокен, почему так медленно работает плагин?
2. Зачем так много вызовов? Можно ли как-то заставить плагин не инициализировать Рутокен каждый раз, когда вызывается SignHash?

Допустим, я хочу подписать 100 хешей. Как я это вижу:
Цитата:
Иниализировать токен
Открыть сессию
Найти приватный ключ по сертификату
Подписать первый хеш
Подписать второй хеш
...
Подписать сотый хеш
Завершить сессию


Как происходит сейчас при использовании плагина:
Цитата:
Иниализация токена
Открытие сессии
Получение информации о характеристиках и доступных механизмах токена
Прочие необъяснимые операции по поиску объектов на токене
Поиск приватного ключа по сертификату
Подпись первого хеша
Завершение сессии

СНОВА Иниализация токена
СНОВА Открытие сессии
....
....
СНОВА Завершение сессии


Можно ли каким-либо способом ускорить процесс подписания хешей?


Отредактировано пользователем 4 ноября 2022 г. 11:04:48(UTC)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.