Русский
  • crypto
  • edge

Переход от Node.js crypto к Web Crypto API: практический опыт

Погружаемся в опыт перехода от crypto к Web Crypto API, предлагая всестороннее руководство, сосредоточенное на 3 распространенных сценариях.

Sijie
Sijie
Developer

Введение

Web Crypto API - это новый инструмент Javascript для криптографии. Он совместим с современными браузерами и ведущими платформами, включая Cloudflare Workers и Vercel, а также Node.js. Такая взаимозаменяемость подразумевает мечту разработчика - напишите свой криптографический код один раз и выполните его на множестве платформ с использованием Web Crypto API.

Однако у Node.js уже есть модуль "crypto" с долгой историей, оставляющий значительное количество устаревшего кода, нуждающегося в миграции. В этой статье мы подробно рассмотрим опыт перехода, предоставляя всестороннее руководство, сосредоточенное на 3 общих сценариях. Мы стремимся осветить путь к успешной миграции.

Что такое Web Crypto API

Web Crypto API, открытый стандарт W3C для JavaScript, - это коллекция стандартизированных криптографических примитивов, определенных в спецификации Web Cryptography API. Он был создан после того, как несколько браузеров и платформ начали добавлять свои собственные несовместимые криптографические функции.

API предлагает примитивы для генерации ключей, шифрования и дешифрования, цифровых подписей, ключевого и битового вывода и криптографического дайджеста. Он основывается на интерфейсе, называемом SubtleCrypto, вы можете найти больше деталей и руководств в документации Mozilla MDN.

Но у Node.js уже есть модуль крипто?

Разработчики Node.js обычно знакомы с крипто модулем. Он предлагает полный набор криптографических примитивов. Этот модуль не только предоставляет механизмы для тех же криптографических операций, определенных в Web Crypto API, но часто включает более широкий диапазон криптографических алгоритмов.

Так зачем нам все еще нужен Web Crypto API? Поскольку Javascript становится популярным на многих платформах и средах, от клиентской стороны до серверов и особенно на периферии, важно иметь кросс-платформенный криптографический инструмент для упрощения процессов.

Кроме того, функции в стандарте Web Crypto API все возвращают обещания и поддерживают синтаксис async / await. Это значительное преимущество перед модулем crypto, который синхронен и может блокировать цикл событий.

А есть интересная вещь: Node.js добавляет его поддержку для Web Crypto API, что означает, что в большинстве случаев Web Crypto API идеален для всех известных платформ.

Использование Web Crypto API

На большинстве платформ коллекция API Web Crypto доступна через глобальный объект crypto, который включает 3 основных утилиты: getRandomValues, randomUUID и subtle.

Есть много отличий по сравнению с традиционным модулем крипто. Они могут быть суммированы в 3 наиболее распространенных части. Давайте пройдемся по ним и посмотрим, как перейти от существующего кода.

#1 Генерация случайных значений

В крипто модуле вы можете генерировать случайные значения, вызывая randomBytes

В Web Crypto есть похожая функция под названием getRandomValues, но возвращаемое значение - это ArrayBuffer, поэтому нам нужен еще один шаг для его преобразования в строку.

#2 Хеширование (или дайджест)

createHash легко использовать в крипто модуле:

В Web Crypto мы можем использовать subtle.createHash

Как видите, также требуется преобразование из ArrayBuffer в строку hex.

#3 Шифрование и дешифрование

В крипто модуле AES-шифрование и дешифрование можно реализовать так:

В Web Crypto нам нужно сначала создать ключ с помощью importKey:

Вывод

Как вы можете видеть, миграция не сложна, главное - изменить синтаксис, чтобы соответствовать новому API и обработать ArrayBuffer с помощью TextEncoder.

Как продукт идентификации, Logto использует криптографию во многих местах. Мы перешли от модуля крипто к Web Crypto API. Этот переход позволяет нам лучше адаптироваться к окружениям на периферии и делает возможным безопасное выполнение кода SDK в браузере.