Правительство Москвы всё-таки запустило систему цифровых пропусков на передвижение по городу, чем вызвало гейзер известной субстанции не только в этих ваших интернетах, но и в реальном полумире. Увы, среди этого фонтана возмущений есть и справедливые претензии, даже с учетом того, что большая их часть должна быть адресована не столько правительству, сколько руководству ГУ МВД. И главная ошибка мэрии в том, что они позволили разработчикам системы реализовать никуда не годную архитектуру.
По сути цифровой пропуск представляет собой идентификатор записи в базе данных, размещенной на серверах мэрии. Для того, чтобы проверить право человека передвигаться по городу, необходимо через сеть обратиться к этой базе данных и получить необходимую для проверки информацию: по крайней мере действительность пропуска и ФИО и номер паспорта человека, а в идеале ещё адреса пребывания и назначения и цель поездки. Всё это является конфиденциальной информацией и требует защиты от несанкционированного доступа. В теории, такую защиту может обеспечить какой-нибудь VPN, но стоимость такого решения для всего лишь 1000 устройств составит, если я правильно посчитал цены Инфотекса, более 4 млн. рублей.
Но есть основания полагать, что разработчики системы выбрали альтернативный способ защиты данных - система маскирует номер паспорта, сообщая первые две и последние две цифры, заменяя остальные цифры символом X. Очень странное решение, если не сказать идиотское, из которого с высокой вероятностью следует, что защиты от НСД нет никакой и путём перебора 16 символов можно получить информацию о передвижениях всех людей, которым выданы пропуска.
Кроме того, недоступность базы данных означает невозможность проверить не только действительность цифрового пропуска, но даже его достоверность, то есть выдан ли пропуск тому самому человеку, которые его предъявляет!
Поэтому я решил реализовать в коде способ, предложенный в предыдущей статье, с некоторыми изменениями. Суть предлагаемого способа реализации цифровых пропусков заключается в следующем:
- В цифровой пропуск включается вся информация, необходимая для проверки права гражданина на передвижения по городу, в том числе такие, как ФИО, паспорт, адреса пребывания и назначения и так далее.
- Цифровой пропуск подписывается электронной подписью, при этом может использоваться как квалифицированная, так и неквалифицированная подпись.
- Цифровой пропуск, дополненный строкой бит, полученных в результате процесса формирования электронной подписи, преобразуется в графическое изображение с использованием символики штрихового кодирования QR code.
- Сертификат ключа проверки электронной подписи, при помощи которой подписывается пропуск, размещается на устройстве, предназначенном для проверки пропуска. Распространение и обновление сертификатов возможно путём размещения сертификатов на общедоступном HTTP или FTP ресурсе.
- При проверке цифрового пропуска графическое изображение пропуска считывается и декодируется, проверяется его электронная подпись с использованием заранее сохраненного на устройстве сертификата ключа проверки и, посредством запроса к базе данных, проверяется действительность пропуска.
Для обеспечения наименьшего времени внедрения содержание цифрового пропуска представляется в виде текста в кодировке UTF-8, каждая строка которого содержит название ключа и значение, разделенные двоеточием. Предусматривается три специальных названия ключа:
“ID” - содержит номер цифрового пропуска;
“Crt” - содержит серийный номер сертификата ключа проверки подписи, с помощью которой подписан цифровой пропуск;
“Sig” - содержит строку бит, полученных в результате процесса формирования электронной подписи.
Например:
ID: 12AB-CD34-E56F-7GH8
ФИО: Иванов Иван Иванович
Паспорт: 4501 234567
Crt: 00DF05C1337A5AFBCD
Sig: 4979...B3F6D7F
Формирование строки бит, используемой в качестве исходных данных процесса формирования и проверки электронной подписи, выполняется в соответствии с алгоритмом:
- Из названий ключей цифрового пропуска и значений ключей удалить начальные, конечные и множественные внутренние пробельные символы.
- Сортировать названия ключей в лексикографическом порядке.
- Из полученного на шаге 2 массива названий ключей выбрать первый, целевую строку бит инициализировать пустой.
- Дополнить целевую строку бит битами названия ключа, затем битами значения ключа.
- Если в массиве, полученном на шаге 2, остались названия ключей, то выбрать следующий и перейти к шагу 4, иначе завершить алгоритм.
Формирование цифрового пропуска выполняется в соответствии с алгоритмом:
- Из входных данных удалить ключ “Sig”, затем по приведенному выше алгоритму вычислить строку бит, используемую в качестве исходных данных процесса формирования электронной подписи.
- Дополнить входные данные ключом “Sig”, значение ключа представляется в шестнадцатеричном виде.
- Полученные на шаге 2 данные преобразовать в графическое изображение с использованием символики штрихового кодирования QR code.
Проверка электронной подписи цифрового пропуска выполняется в соответствии с алгоритмом:
- Считать и декодировать штриховой код пропуска.
- Выполнить поиск сертификата ключа проверки электронной подписи с серийным номером, равным значению ключа “Crt”.
- Если сертификат найден, перейти к шагу 4, иначе завершить алгоритм с отрицательным результатом.
- Значение ключа Sig декодировать в строку бит и запомнить.
- Из содержания цифрового пропуска удалить ключ “Sig” и его значение, затем по приведенному выше алгоритму вычислить строку бит, используемую в качестве исходных данных процесса проверки электронной подписи.
- Выполнить проверку электронной подписи цифрового пропуска с использованием строки бит, полученной на шаге 4, и завершить алгоритм с результатом, соответствующим результату проверки электронной подписи.
Описанные алгоритмы формирования и проверки цифрового пропуска были реализованы на платформе Java и если это кому-то будет интересно - готов поделиться кодом и выслушать замечания.