Pull to refresh

Как я решил защищать документы от подделки и «изобрел» электронную цифровую подпись

Reading time 5 min
Views 10K

О чем это


На идею создать свой маленький интернет-проект по защите документов от подделки, меня натолкнула дискуссия на форуме дефектоскопистов, посвященная повальной подделке выданных ими заключений по контролю качества.

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

Актуальность задачи защиты от подделок


Дело в том, что в наш век безбумажной информации ни одно капитальное строительство, будь то газопровод или торговый центр, не обходится без подготовки полного комплекта исполнительной документации (as built), частью которой являются заключения по неразрушающему контролю (визуальному, радиографическому, ультразвуковому).



Это заключение — оформленный на определенном бланке документ с выводом о годности или негодности, к примеру, сварного шва. Услуги по неразрушающему контролю стоят денег и часто весьма немалых. Недобросовестный заказчик/посредник может нанять аккредитованную лабораторию, получить от нее несколько заключений и прекратить или приостановить работу.

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

В рамках дискуссии — как защитить свои документы, была высказана идея наносить на документ QR-код, в котором будет записан номер заключения, дата и вывод о годности или не годности объекта контроля. Чем хорош такой способ — QR-код останется хорошо различим при сканировании, копировании документа.

Однако, просто сгенерировать QR-код с нужным содержимым точно также смогут и мошенники.

Рождение идеи


И тут меня осенила мысль — а почему бы не шифровать содержимое такого QR-кода надежным алгоритмом. Раз так — надо придумать способ его расшифровывать при сканировании, например через камеру смартфона. Здесь родилась идея расшифровку делать на стороне web-сервиса, который будет хранить ключ для расшифровки.

В последний раз я делал сайт в 2000 году в notepad и не слишком хорошо знаком с современными технологиями сайтостроительства, поэтому выбрал Wix, подумав, что с помощью сервиса я получу красивую картинку и минимальные возможности работы с базой данных, а с помощью Wix code закодирую то что мне нужно.

Сразу скажу, что это у меня получилось без особого труда и за несколько вечеров я, будучи дилетантом, вполне смог собрать из более-менее готовых блоков нужное мне решение.

Шифрование


Готовый алгоритм AES 128-битного шифрования с реализацией на Java Script я взял на Github и разместил в backend разделе сайта.

Это была, пожалуй, самая простая часть работы. Как работает само шифрование мне было не совсем неинтересно. Меня волновала грандиозность задуманного.

Главное не забыть перевести кодируемый текст в Bytes, а результат шифрования в HEX.

// Convert text to bytes
var textBytes = aesjs.utils.utf8.toBytes(text);

// The counter is optional, and if omitted will begin at 1
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));

var encryptedBytes = aesCtr.encrypt(textBytes);

// To print or store the binary data, you may convert it to hex
var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);

Генерация QR-кода


Я воспользовался готовым API.

Для работы достаточно создать объект html1 — для отображения произвольного html кода и вызвать фунцию API

let val = “Шифруемый текст"
$w("#html1").src = "https://api.qrserver.com/v1/create-qr-code/?size=100x100&data=" + val.toString();
$w("#html1").show();

Работа с пользователями


Wix поддерживает базовые функции регистрации пользователей и редактирования профиля. Инструмент, несколько глючный, но работоспособный.

Мне лишь потребовалось добавить поле, которое описывает наименование организации, которую представляет зарегистрированный пользователь, но это поле read only и его заполняет администратор сервиса, когда получает подтверждение, что зарегистрированный пользователь действительно представляет указанную организацию.

Потребовалось также прикрутить простейшую логику, связанную с платным/бесплатным доступом к функциям (до 20 документов в месяц можно защитить бесплатно) и сроком оплаты услуг.

Принцип работы


К аккаунту пользователя привязывается уникальный закрытый ключ шифрования.

Залогиненый пользователь заполняет форму с информацией о заключении (номер, дата, результат):



Затем алгоритм выдает URL, содержащий зашифрованный текст TEXT и, выступающий в виде открытого ключа USER_ID, как на примере ниже:

https://*имя сервиса*/checkqr?user=3b01b0aa-68a0-4521-ab12-f17b86d3eabc&v=1.0&text=8a026594c26be959f4280e28fe8402c1acef233e369a31613d654d3b0a5bbaca206f3058d27d2fde66b65cb64a5a6caecb69b07ad39c0015e923dad89eb723

URL превращается в QR-код, который пользователь уже наносит на свой документ, скопировав в буфер обмена (можно включить в исходный файл или же налепить как стикер на готовый напечатанный документ).



Что здесь важно — как таковая информация не попадает в базу данных сайта, а остается лишь в виде этой ссылки и QR-кода, содержащего эту ссылку. Таким образом, никакая информация о содержимом защищаемого документа на сервере не хранится.

Проверка кода выполняется сайтом при распарсивании ссылки


Для распарсивания при распознавании сайтом ссылки я воспользовался справкой по Wix code
www.wix.com/code/reference/wix-http-functions.html

Если при расшифровке что-то пошло не так, а это может быть, если в оригинальный QR-код попытались внести какие-то изменения
«Код документа расшифрован с ошибкой. Возможна подделка. Обратитесь в организацию, подготовившую документ для получения пояснений»
Если расшифровка завершена успешно, то выдается расшифрованный текст, содержащий название лаборатории, номер документа, дату выдачи и результат, а пользователю предлагается сопоставить результат расшифровки с тем, что он видит на реальном документе.

Заключение


От рождения идеи я с помощью ряда готовых кирпичиков пришел к работающей реализации.

Приглашаю к дискуссии по придуманной мной идее, попытке протестировать/взломать мой сервис.

Что еще осталось доделать


  • Написать по итогам реализации на habr
  • Разобраться как сбросить query, если один раз уже была проверка ссылки
  • Придумать как ужать зашифрованный текст, потому что когда длинный URL кодируется, то размер QR-кода чересчур большой
  • Добавить возможность копирования кода в буфер обмена или отправлять на почту по щелчку на кнопку (пока не разобрался как сделать это в javascript)
  • Улучшить работу с мобильной версией

Предварительный ответ на возможную критику:


Не проще лаборатории вести реестр заключений на своем сайте, а подобная QR метка будет вести на этот реестр или даже выводить копию заключения?
Это можно сделать, но потребуется значительная ручная работа или внедрение собственного IT решение наподобие разработанного мной, но это явно обойдется дороже чем воспользоваться готовым решением.

Сделать такой реестр полностью общедоступным нельзя, потому что информация не является открытой, а может быть рассмотрена лишь исполнителем, заказчиком и Ростехнадзором.
Tags:
Hubs:
+8
Comments 34
Comments Comments 34

Articles