Общие принципы работы с ЭЦП (УД77)
Электронная цифровая подпись
Условно термином «ЭЦП» (электронная цифровая подпись) можно обозначить определенный набор криптографических функций, который де-факто включен в стандарт современного электронного документооборота.
Далее для этого набора функций будет использоваться термин «подсистема ЭЦП» или «криптоподсистема». Термином «ЭЦП» будет обозначаться конкретная электронной подписи конкретного физического лица под конкретным документом. Основные функции, которые должна выполнять подсистема ЭЦП:
- Генерация ключей ЭЦП
- Генерация электронной цифровой подписи документа с использованием секретных ключей ЭЦП
- Проверка корректности цифровой подписи документа
Кроме основных функций криптоподсистема может также выполнять и другие функции, среди которых можно выделить:
- Шифрование документов, которая позволяет читать документы только тому физическому лицу, которому они адресованы
- Надежная аутентификация пользователя при регистрации в системе
Для реализации приведенного перечня функций необходимо использовать какой-либо пакет программ, реализующий базовые криптографические функции. Желательно также, чтобы этот пакет программ содержал криптобиблиотеку, которая позволяет встраивать криптографический функционал в другие программные продукты.
Функции подсистемы ЭЦП
Генерация ключей ЭЦП
Генерацию ключей ЭЦП на начальном этапе достаточно выполнять внешними программами из криптографического пакета. Ключи может генерировать один или более администраторов. Но для того, чтобы избежать компрометации ключей нужно, чтобы каждый пользователь мог сам сгенерировать/перегенериовать свой комплект секретных и открытых ключей. После генерации комплекта ключей пользователь должен зарегистрировать свой открытый ключ у администратора для того, чтобы другие пользователи системы могли проверить подлинность его электронной подписи.
Таким образом, надо чтобы программа генерации была доступна пользователю системы как отдельная программа, либо была включена в состав системы. Также желательно иметь средства доставки открытых ключей от пользователя к администратору и зарегистрированных ключей (сертификатов) обратно.
Генерация электронной цифровой подписи документа
Генерацию ЭЦП документа выполняет криптобиблиотека. Одной из функций криптобиблиотеки является генерация на основе двух массивов байт — документа и секретного ключа — третьего массива — электронной подписи. Поэтому система должна предоставить криптобиблиотеке документ в виде такого массива байт, который может быть повторно сформирован в дальнейшем для выполнения проверки ЭЦП.
Таким образом, чтобы сформировать электронную подпись документа системы, нужно заранее определить, какой набор полей этого документа будет подписываться. В этот набор полей могут также включаться внешние/вложенные файлы. И, следовательно, за счет этого можно отслеживать то, что эти файлы будут неизменны.
Этот же механизм позволяет иметь несколько подписей под одним и тем же документом системы. Для этого подписи должны храниться в табличной части этого, либо сопряженного документа.
Проверка корректности цифровой подписи документа
Процедура проверки корректности цифровой подписи аналогична процедуре формирования цифровой подписи. За исключением того, что вместо секретного ключа пользователя используется его открытый ключ. Таким образом, нужно из полей проверяемого документа и вложенных в него файлов подготовить тот же массив байтов, что и при подписании документа, и передать его в криптобиблиотеку вместе с подписью для проверки. Также в криптобиблиотеку нужно передать открытый ключ пользователя, подписавшего документ. Следовательно, в системе должен содержаться справочник, который хранит открытые ключи всех пользователей, подписи которых будут проверяться.
Реализация подсистемы ЭЦП
Здесь рассмотрена простейшая схема реализации подсистемы ЭЦП. Вот некоторые вопросы, которые нужно решить, чтобы получить достаточно надежную систему с развитым крипто-сервисом:
Система сертификации ключей
Если требуется обмен между организациями, либо если организация содержит сложную структуру с несколькими серверами, то требуется иметь не просто пары открытых/закрытых ключей, а систему сертифицирования ключей. Приведем пример решаемой таким образом задачи.
Есть организации А и Б (либо это подразделения одной организации). В них имеются СотрудникА и СотрудникБ. СотрудникА создал и подписал документ, но СотрудникБ не может проверить подлинность его подписи, потому что сервер организации Б не хранит подписей организации А. Вопрос решается таким образом. У СотрудникаА должен быть сертификат ОрганизацииА, и когда он генерирует подпись под документом, то тот, фактически, содержит подпись ОрганизацииА c указанием того, что она удостоверяет подпись СотрудникаА.
Тогда если СотрудникБ хочет проверить подпись СотрудникаА, то его системе достаточно иметь открытый сертификат ОрганизацииА, чтобы проверить подлинность подписи СотрудникаА.
Таким же образом решается проблема того, что пользователь периодически может (должен) менять свой секретный и открытый ключи. При этом для проверки его старой подписи не нужно иметь его старый открытый ключ, а достаточно иметь подпись ОрганизацииА, и проверять его с помощью сертификата ОрганизацииА.
(Данное описание следует рассматривать лишь как схематическое. Более подробное и корректное описание можно найти в соответствующей литературе.)
Надежность функционирования подсистемы ЭЦП
Для получения каких-либо сертификатов на программный продукт, удостоверяющих, что он пригоден для выполнения своих функций (имеются в виду крипто-функции), следует уделить особое внимание на обеспечение надежности функционирования подсистемы ЭЦП. В том числе, должны быть реализованы функции контроля за неизменностью программного кода, реализующего крипто-функциональность.
Ведь сколь бы ни были хороши и сильны криптоалгоритмы, будет не сложно поправить функцию проверки правильности подписи, чтобы она сообщала, что подпись правильная. Если, конечно, исполняемый код этой функции не защищен какими либо средствами.