Development of an approach to ensuring information security in web-based information systems when transferring data using the Web Cryptography API interface

Cover Page

Cite item

Full Text

Abstract

The aim of the research is to formulate general principles for ensuring information security in web-oriented information systems. The paper describes the main concepts of the Web Cryptography API interface, as well as presents practical aspects of using cryptographic methods to ensure data security in web-oriented information systems. The proposed approach, based on the introduction of a secure system for generating and storing users private keys through the use of the asynchronous ECDSA encryption algorithm via the Web Cryptography API interface, combined with encrypting private keys with passphrases and additional user authentication, allows a high level of protection of private keys from unauthorized access.

Full Text

Введение

Сегодня все возрастающую значимость приобретает необходимость обеспечения безопасности персональных данных1 в веб-ориентированных информационных системах (ВОИС), что обусловлено происходящими процессами цифровой трансформации современного общества, тенденциями повсеместного использования интернет-технологий, переводом большинства бизнес-процессов в онлайн-режим [1]. Переход множества компаний на электронный документооборот, позволяющий ускорить и упростить бизнес-процессы, минимизировать затраты на обработку документов, их физическое хранение и т. д. [1], в свою очередь требует должного уровня защиты конфиденциальной информации при ее хранении и передаче с использованием цифровых каналов связи [2]. Для ряда компаний критически важным является подтверждение подлинности отправителя, достоверности и целостности передаваемой информации, что определяет необходимость использования электронной цифровой подписи [1, 3] как неотъемлемой составляющей информационной безопасности при реализации электронного документооборота.

Безопасность при организации онлайн-взаимодействия в ВОИС требует применения криптографических методов защиты на стороне браузера, гарантирующих безопасность онлайн-протоколов и защиту конфиденциальных данных. Реализация криптографических операций в браузере может быть выполнена с использованием ряда инструментов, одним из которых является рекомендованный W3C интерфейс Web Cryptography API, представляющий стандартизированный способ доступа к криптографическим функциям веб-браузера без необходимости обращения к сторонним библиотекам [4, 5]. Возможности Web Cryptography API поддерживают шаблоны использования ключей в соответствии с лучшими практиками в криптографии [5], а созданные объекты Web Crypto API исключают случайное использование ключей или алгоритмов в недопустимом состоянии.

В рамках настоящего исследования рассмотрим подход к обеспечению информационной безопасности при реализации обмена данными в ВОИС с использованием программного интерфейса Web Cryptography API.

Описание подхода к реализации электронной подписи на базе Web Cryptography API

Интерфейс Web Cryptography API, выбранный для создания методов электронной подписи, предоставляет для генерации ключей множество криптографических алгоритмов [6]. Однако для реализации электронной подписи принято использовать асимметричные алгоритмы шифрования, например, RSA или ECDSA – один из вариантов DSA-алгоритма с более высокой степенью надежности. С учетом проведенного анализа2 для реализации электронной подписи был выбран алгоритм ECDSA, демонстрирующий высокий уровень криптостойкости, производительности, а также возможность достижения программной совместимости и масштабируемости.

В целом подход к реализации электронной подписи заключается в выполнении следующей последовательности действий и рекомендаций, сформулированных с учетом требований Web Cryptography API [4 –6]:

  1. Генерация ключей должна происходить на клиентской части ВОИС (непосредственно в браузере) при помощи асинхронного алгоритма шифрования ECDSA средствами интерфейса Web Cryptography API.
  2. Приватный ключ должен зашифровываться кодовым словом пользователя и в зашифрованном виде храниться на сервере.
  3. Для подписания электронного документа пользователю ВОИС будет необходимо повторно ввести кодовое слово для развертывания закрытого ключа, полученного с сервера, и дополнительного подтверждения своей личности.

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

Реализация методов создания электронной подписи и подписания электронных документов

Для выпуска электронной подписи необходимо сгенерировать приватный и публичный ключи посредством алгоритма ECDSA.

Создадим асинхронный метод generateKeys(), в котором будет происходить вызов метода generateKey() интерфейса WebCryptoApi. Код метода generateKeys() представлен на рисунке 1.

 

Рис. 1. Код метода generateKeys()

Fig. 1. The code for the generateKeys() method

 

При генерации ключей посредством ECDSA алгоритма параметр algorithm представляет собой EcKeyGenParams объект. Данный объект должен включать имя алгоритма name – ECDSA и namedCurve – имя используемой эллиптической кривой в соответствии с рекомендациями NIST. Как показано в работе [7], оптимальным является выбор P-384. Параметр extractable передадим true, т.к. в дальнейшем потребуется использовать метод SubtleCrypto.wrapKey(). В массив keyUsages включим метод sign, потому что впоследствии данным ключом будет производиться подпись документов. Результатом выполнения метода generateKeys() будет объект типа CryptoKeyPair, включающий созданные публичный и приватный ключи электронной подписи.

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

Создадим асинхронный метод getCodewordAsKey(), внутри которого будет происходить преобразование кодового слова из строки в CryptoKey. При помощи вызова enc.encode(codeword).buffer преобразуем кодовое слово – строку в ArrayBuffer – двоичное представление данных. Далее последовательно выполним методы интерфейса WebCryptoApi digest() и importKey(). В метод digest() передадим параметром алгоритм дайджеста (SHA-256) в формате объекта и ранее полученное кодовое слово в формате ArrayBuffer. Код метода getCodewordAsKey() представлен на рисунке 2.

 

Рис. 2. Код метода getCodewordAsKey()

Fig. 2. The code for the getCodewordAsKey() method

 

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

В этом методе вызовем ранее созданный метод getCodewordAsKey() для того, чтобы преобразовать кодовое слово из строки в CryptoKey, и после этого вызовем метод интерфейса WebCryptoApi wrapKey(). Параметр wrapAlgo – объект, указывающий алгоритм, который будет использоваться для шифрования ключа (AES-CBC), где iv – вектор инициализации, передаваемый аргументом в метод wrapPrivateKey(). Код метода wrapPrivateKey() продемонстрирован на рисунке 3.

 

Рис. 3. Код метода wrapPrivateKey()

Fig. 3. The code for the wrapPrivateKey() method

 

Для отправки сгенерированных ключей на сервер необходимо преобразовать их в формат BASE64. Для этого реализуем асинхронные методы preparePublicKey() и preparePrivateKey().

В методе preparePublicKey() вызовем метод интерфейса WebCryptoApi exportKey(), который принимает в качестве входных данных CryptoKey объект и возвращает ключ во внешнем переносимом формате. Результат выполнения предыдущей операции преобразуем в Uint8Array, а затем в BASE64. Код метода preparePublicKey() представлен на рисунке 4.

 

Рис. 4. Код метода preparePublicKey()

Fig. 4. The code for the preparePublicKey()method

 

Метод preparePrivateKey() дополнительно позволяет объединить приватный ключ и вектор инициализации для дальнейшей возможности их совместной передачи и разъединения. Код данного метода представлен на рисунке 5.

 

Рис. 5. Код метода preparePrivateKey()

Fig. 5. The code for the preparePrivateKey() method

 

Вектор инициализации, полученный при оборачивании ключа кодовым словом, впоследствии будет нужен для обратной операции – расшифровки приватного ключа для осуществления подписи документа. Преобразуем зашифрованный кодовым словом приватный ключ в Uint8Array и выполним объединение массивов. Далее преобразуем полученное значение в BASE64.

На рисунке 6 представлен код метода createSignature(), который предназначен непосредственно для выпуска электронной подписи.

 

Рис. 6. Код метода createSignature()

Fig. 6. The code for the createSignature() method

 

Далее создадим метод getUnwrapKey(), принимающий параметрами приватный ключ, вектор инициализации и кодовое слово. Результатом выполнения данного метода будет распакованный приватный ключ в формате CryptoKey. Код данного метода представлен на рисунке 7.

 

Рис. 7. Код метода getUnwrapKey()

Fig. 7. The code for the getUnwrapKey() method

 

Для подписания документа необходимо сначала расшифровать приватный ключ, получаемый с сервера. Создадим асинхронный метод unwrapPrivateKey(), принимающий кодовое слово и приватный ключ (объединенный с вектором инициализации). Здесь происходит вызов метода getUnwrapKey() с использованием механизма для обработки исключений. Если операция распаковки ключа выполнена успешно, метод вернет расшифрованный приватный ключ в формате CryptoKey. Код метода продемонстрирован на рисунке 8.

 

Рис. 8. Код метода unwrapPrivateKey()

Fig. 8. The code for the unwrapPrivateKey() method

 

Для осуществления подписи документов создадим асинхронный метод signDocument(), принимающий параметрами файл, содержащий документ, и приватный ключ. В рамках данного метода вызовем метод интерфейса WebCryptoApi sign(). Результатом выполнения данного метода является подписанный документ в формате ArrayBuffer. Код данного метода представлен на рисунке 9.

 

Рис. 9. Код метода signDocument()

Fig. 9. The code for the signDocument() method

 

Далее создадим асинхронный метод signatureDocument(), принимающий параметрами файл документа, кодовое слово и приватный ключ (объединенный с вектором инициализации), полученные с сервера. Вызовем созданный ранее метод unwrapPrivateKey(), передав в него кодовое слово, объединенный приватный ключ и вектор инициализации. Далее вызовем метод signDocument(), передав в него полученный распакованный приватный ключ и файл документа. Полученную последовательность в формате ArrayBuffer подписанного файла преобразуем в BASE64 формат для отправки на сервер. Код данного метода продемонстрирован на рисунке 10.

 

Рис. 10. Код метода signatureDocument()

Fig. 10. The code for the signatureDocument() method

 

Заключение

В целом подход, основанный на применении методов спецификации Web Cryptography API, обеспечивает защиту данных пользователей на клиентской стороне ВОИС. Помимо описанных возможностей создания электронной цифровой подписи, область применения Web Cryptography API варьирует от аутентификации пользователя или службы, подписи документов или кода, а также обеспечения конфиденциальности и целостности связи.

Применение Web Cryptography API является перспективным направлением в области определения криптографических примитивов, которые должны быть развернуты в браузерах в JS-приложениях и могут быть использованы, например, для взаимодействия с криптомодулем Node.js. Однако следует отметить, что достижение должного уровня информационной безопасности ВОИС требует разработки формализованных моделей, учитывающих противоречивые политики безопасности сочетания множества API, которые могут быть использованы при веб-разработке.

 

1 Федеральный закон «О персональных данных» от 27.07.2006 № 63-ФЗ // Российская газета. 2006 г. [Электронный ресурс]: https://rg.ru/documents/2006/07/29/personaljnye-dannye-dok.html (дата обращения: 20.01.2024).

2Ступина М. В., Илющенко А. Н. Сравнительный анализ алгоритмов электронной подписи [Электронный ресурс] // Молодой исследователь Дона. 2023. № 8 (3). С. 78–81. URL: https://mid-journal.ru/upload/iblock/ 952/17_1711-Ilyushchenko_78_81.pdf (дата обращения: 29.01.2024).

 

×

About the authors

Maria V. Stupina

Don State Technical University

Author for correspondence.
Email: masamvs@bk.ru
ORCID iD: 0000-0002-6394-6966

Candidate of Pedagogical Sciences, Associate Professor, Department of Information Technology

Russian Federation, 344003, Rostov-on-Don, 1 Gagarina square

References

  1. Mekhdiev E.T., Plekhanova E.A. Development of electronic document management systems in the digital economy. Diskussiya [Discussion]. 2023. No. 1(116). Pp. 58–70. DOI: 10.46320/ 2077-7639-2022-6-115-52-70. (In Russian)
  2. Goncharov E.I., Shatkovskaya T.V. Problems of using digital signatures in electronic document management in Russia. Severo-Kavkazskiy yuridicheskiy vestnik [North Caucasian Legal Bulletin]. 2020. No. 2. Pp. 97–103. doi: 10.22394/2074-7306-2020-1-2-97-103. (In Russian)
  3. Baranov A.S. Use of cryptographic information protection tools in organizations. Mezhdunarodnyy nauchno-issledovatel'skiy zhurnal [International Scientific Research Journal]. 2020. No. 6-1 (96). Pp. 131–133. doi: 10.23670/IRJ.2020.96.6.023. (In Russian)
  4. Bylinskiy M.D. Protecting JavaScript applications using the Web Cryptographs Api. Vestnik Baltiyskogo federal'nogo universiteta im. I. Kanta. Seriya: Fiziko-matematicheskie i tekhnicheskie nauki [Bulletin of the Baltic Federal University. I. Kant. Series: Physics, mathematics and technical sciences]. 2022. No. 1. Pp. 53–60. (In Russian)
  5. Cairns K., Halpin H., Steel G. Security Analysis of the W3C Web Cryptography API. Proceedings of Security Standardisation Research (SSR). Gaithersberg. 2017. Pp. 112–140. doi: 10.1007/978-3-319-49100-4_5
  6. Wichmann P., Blochberger M., Federrath H. Web Cryptography API. Prevalence and Possible Developer Mistakes. In Proceedings of the 17th International Conference on Availability, Reliability and Security (ARES '22). Association for Computing Machinery. New York. 2022. Pp. 1–10. doi: 10.1145/3538969.3538977
  7. Samir A., Abo-Taleb M., Shalaby et al. A Side-Channel Attack Resistive ECDSA. International Conference on Advanced Information Systems and Engineering. Journal of Physics: Conference Series. Cairo, Egypt. 2019. Pp. 112–140. doi: 10.1088/1742-6596/1454/1/012003

Supplementary files

Supplementary Files
Action
1. JATS XML
2. Fig. 1. The code for the generateKeys() method

Download (23KB)
3. Fig. 2. The code for the getCodewordAsKey() method

Download (45KB)
4. Fig. 3. The code for the wrapPrivateKey() method

Download (36KB)
5. Fig. 4. The code for the preparePublicKey()method

Download (33KB)
6. Fig. 5. The code for the preparePrivateKey() method

Download (46KB)
7. Fig. 6. The code for the createSignature() method

Download (53KB)
8. Fig. 7. The code for the getUnwrapKey() method

Download (48KB)
9. Fig. 8. The code for the unwrapPrivateKey() method

Download (63KB)
10. Fig. 9. The code for the signDocument() method

Download (29KB)
11. Fig. 10. The code for the signatureDocument() method

Download (41KB)

Copyright (c) 2024 Stupina M.V.

Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License.

This website uses cookies

You consent to our cookies if you continue to use our website.

About Cookies