Объект window.crypto представляет собой встроенный
интерфейс браузера, предоставляющий доступ к криптографическим функциям
на уровне веб-API. Он является точкой входа в Web Crypto API и доступен
только в контексте безопасного соединения (HTTPS или localhost).
Структурно window.crypto состоит из двух ключевых
компонентов:
crypto.getRandomValues()crypto.subtleДополнительно объект содержит несколько служебных свойств, зависящих от реализации браузера, но основная функциональность сосредоточена именно в перечисленных частях.
Базовая форма объекта выглядит следующим образом:
window.crypto = {
getRandomValues,
subtle
}
Важно понимать, что crypto является неизменяемым
объектом. Его нельзя переопределить или расширить через присваивание
новых свойств в строгом режиме.
Метод getRandomValues() используется для генерации
криптографически стойких случайных чисел. Он работает с типизированными
массивами и заполняет их случайными значениями.
crypto.getRandomValues(typedArray)
Uint8ArrayUint16ArrayUint32ArrayBigUint64ArrayМетод не возвращает новый массив. Он изменяет переданный объект напрямую.
const array = new Uint8Array(16);
crypto.getRandomValues(array);
После выполнения массив содержит случайные значения, пригодные для криптографических операций: генерации токенов, соли, nonce и других элементов безопасности.
Существует несколько строгих ограничений:
Array или
Float32Arraycrypto.subtle (SubtleCrypto) — это основной интерфейс
для криптографических операций. Он предоставляет набор асинхронных
методов, возвращающих Promise.
ArrayBuffer и
TypedArrayОбъект crypto.subtle включает следующие группы
методов:
digest()generateKey()importKey()exportKey()encrypt()decrypt()sign()verify()wrapKey()unwrapKey()Метод digest используется для получения
криптографического хеша данных.
crypto.subtle.digest(algorithm, data)
"SHA-1""SHA-256""SHA-384""SHA-512"const encoder = new TextEncoder();
const data = encoder.encode("message");
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
Результат — ArrayBuffer, содержащий хеш.
Метод generateKey создаёт криптографические ключи для
симметричных и асимметричных алгоритмов.
crypto.subtle.generateKey(algorithm, extractable, keyUsages)
AES-GCM, AES-CBC,
AES-KW)RSA-OAEP, RSASSA-PKCS1-v1_5)const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
);
extractable — можно ли экспортировать ключkeyUsages — допустимые операцииИспользуется для загрузки ключа из внешнего представления.
crypto.subtle.importKey(format, keyData, algorithm, extractable, usages)
Форматы:
"raw""pkcs8""spki""jwk"Позволяет получить ключ в экспортируемом виде.
crypto.subtle.exportKey(format, key)
Используются для симметричного и асимметричного шифрования.
crypto.subtle.encrypt(algorithm, key, data)
crypto.subtle.decrypt(algorithm, key, data)
const iv = crypto.getRandomValues(new Uint8Array(12));
const encrypted = await crypto.subtle.encrypt(
{
name: "AES-GCM",
iv
},
key,
data
);
Используются для цифровых подписей.
crypto.subtle.sign(algorithm, key, data)
crypto.subtle.verify(algorithm, key, signature, data)
Шифрует ключ другим ключом.
crypto.subtle.wrapKey(format, key, wrappingKey, algorithm)
Расшифровывает и восстанавливает ключ.
crypto.subtle.unwrapKey(format, wrappedKey, unwrappingKey, algorithm, unwrappedKeyAlgorithm, extractable, keyUsages)
С точки зрения архитектуры браузера, window.crypto
является связующим слоем между JavaScript и нативной криптографической
реализацией операционной системы.
Структурно можно представить так:
window
└── crypto
├── getRandomValues()
└── subtle
├── digest()
├── generateKey()
├── importKey()
├── exportKey()
├── encrypt()
├── decrypt()
├── sign()
├── verify()
├── wrapKey()
└── unwrapKey()
Все методы subtle возвращают Promise, что
связано с несколькими факторами:
Web Crypto API не работает со строками напрямую. Все входные и выходные данные должны быть в бинарном формате:
ArrayBufferTypedArrayДля преобразования используется:
TextEncoderTextDecoderwindow.crypto доступен только при следующих
условиях:
При открытии через http объект
crypto.subtle может быть недоступен или частично
ограничен.
Объект crypto защищён от модификации:
Это сделано для предотвращения подмены криптографических функций.
Поддержка алгоритмов зависит от браузера, но обычно включает:
crypto выполняет роль контейнера, а subtle
— вычислительного ядра.
Разделение функций:
crypto.getRandomValues() — генерация случайных
чиселcrypto.subtle — криптографические операции высокого
уровняТакое разделение позволяет отделить простые операции от вычислительно сложных.
ArrayBufferkeyUsages