SubtleCrypto
Базовая реализация Широко доступна *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Защищенная среда: Эта функция доступна только в защищённых контекстах (HTTPS), в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Интерфейс SubtleCrypto API шифрования веб-приложений предоставляет ряд низкоуровневых криптографических функций.
Имя интерфейса включает термин «скрытый», чтобы указать, что многие его алгоритмы имеют тонкие требования к использованию, и, следовательно, он должен использоваться с осторожностью, чтобы обеспечить соответствующие гарантии безопасности.
Экземпляр SubtleCrypto доступен как свойство subtle интерфейса Crypto, который, в свою очередь, доступен в окнах через свойство Window.crypto и в рабочих процессах через свойство WorkerGlobalScope.crypto.
Предупреждение: Этот API предоставляет ряд низкоуровневых криптографических примитивов. Их очень легко использовать неправильно, и связанные с этим подводные камни могут быть очень скрытыми.
Даже при правильном использовании основных криптографических функций, безопасное управление ключами и общий дизайн системы безопасности очень сложно реализовать, и, как правило, это область специализированных экспертов по безопасности.
Ошибки в проектировании и реализации системы безопасности могут сделать систему безопасности совершенно неэффективной.
Пожалуйста, изучайте и экспериментируйте, но не гарантируйте и не предполагайте безопасность вашей работы, прежде чем её тщательно пересмотрит человек, разбирающийся в этой области. Курс Crypto 101 может быть отличным местом для начала изучения проектирования и реализации безопасных систем.
Свойства экземпляра
Этот интерфейс не наследует никаких свойств, так как у него нет родительского интерфейса.
Методы экземпляра
Этот интерфейс не наследует никаких методов, так как у него нет родительского интерфейса.
SubtleCrypto.encrypt()-
Возвращает
Promise, который выполняется с зашифрованными данными, соответствующими заданному открытому тексту, алгоритму и ключу. SubtleCrypto.decrypt()-
Возвращает
Promise, который выполняется с открытыми данными, соответствующими зашифрованному тексту, алгоритму и ключу. SubtleCrypto.sign()-
Возвращает
Promise, который выполняется с подписью, соответствующей тексту, алгоритму и ключу. SubtleCrypto.verify()-
Возвращает
Promise, который выполняется со значением булевого типа, указывающим, соответствует ли заданная подпись тексту, алгоритму и ключу. SubtleCrypto.digest()-
Возвращает
Promise, который выполняется с дайджестом, сгенерированным из алгоритма и текста. SubtleCrypto.generateKey()-
Возвращает
Promise, который выполняется с только что сгенерированнымCryptoKeyдля симметричных алгоритмов илиCryptoKeyPair, содержащим два только что сгенерированных ключа для асимметричных алгоритмов. Они будут соответствовать заданному алгоритму, правам доступа и возможности извлечения. SubtleCrypto.deriveKey()-
Возвращает
Promise, который выполняется с только что сгенерированнымCryptoKey, полученным из основного ключа и заданного алгоритма. SubtleCrypto.deriveBits()-
Возвращает
Promise, который выполняется с только что сгенерированным буфером псевдослучайных битов, полученных из основного ключа и заданного алгоритма. SubtleCrypto.importKey()-
Возвращает
Promise, который выполняется сCryptoKey, соответствующим формату, алгоритму, сырым данным ключа, правам доступа и возможности извлечения. SubtleCrypto.exportKey()-
Возвращает
Promise, который выполняется с сырыми данными ключа, содержащими ключ в требуемом формате. SubtleCrypto.wrapKey()-
Возвращает
Promise, который выполняется с зашифрованным симметричным ключом для использования (передачи и хранения) в небезопасных средах. Зашифрованный ключ соответствует указанному в параметрах формату, а шифрование выполняется заданным ключом шифрования с использованием указанного алгоритма. SubtleCrypto.unwrapKey()-
Возвращает
Promise, который выполняется сCryptoKey, соответствующим зашифрованному ключу.
Использование SubtleCrypto
Мы можем разделить функции, реализованные этим API, на две группы: криптографические функции и функции управления ключами.
Криптографические функции
Это функции, которые вы можете использовать для реализации функций безопасности, таких как конфиденциальность и аутентификация в системе. API SubtleCrypto предоставляет следующие криптографические функции:
Функции управления ключами
За исключением digest(), все криптографические функции в API используют криптографические ключи. В API SubtleCrypto криптографический ключ представлен с помощью объекта CryptoKey. Для выполнения операций, таких как подпись и шифрование, вы передаёте объект CryptoKey в функцию sign() или encrypt().
Генерация и вычисление ключей
Функции generateKey() и deriveKey() обе создают новый объект CryptoKey.
Разница в том, что generateKey() каждый раз при вызове будет генерировать новое уникальное значение ключа, а deriveKey() вычисляет ключ из исходного набора ключей. Если вы предоставите один и тот же набор ключей двум разным вызовам функции deriveKey(), вы получите два объекта CryptoKey с одинаковым внутренним значением. Это полезно, например, для вычисления ключа шифрования из пароля и последующего вычисления того же ключа из того же пароля для расшифровки данных.
Импорт и экспорт ключей
Чтобы ключи были доступны за пределами вашего приложения, вам необходимо экспортировать ключ, и для этого предназначена функция exportKey(). Вы можете выбрать один из ряда форматов экспорта.
Обратной функцией к exportKey() является importKey(). Вы можете импортировать ключи из других систем, и поддержка стандартных форматов, таких как PKCS #8 и JSON Web Key, поможет вам в этом. Функция exportKey() экспортирует ключ в нешифрованном формате.
Если ключ является конфиденциальным, вы должны использовать wrapKey(), которая экспортирует ключ, а затем шифрует его с помощью другого ключа; API использует «ключ для упаковки ключей».
Обратной функцией к wrapKey() является unwrapKey(), которая расшифровывает и затем импортирует ключ.
Хранение ключей
CryptoKey является сериализуемым объектом, что позволяет хранить и извлекать ключи с помощью стандартных API веб-хранилища.
В спецификации предполагается, что большинство разработчиков будут использовать API IndexedDB, храня объекты CryptoKey по идентификатору ключа, имеющему смысл для приложения, наряду с любой другой метаданными, которую оно посчитает полезной. Это позволяет хранить и извлекать объект CryptoKey без необходимости раскрывать его внутренний ключ материалу приложения или среде JavaScript.
Поддерживаемые алгоритмы
Криптографические функции, предоставляемые API Web Crypto, могут выполняться одним или несколькими различными криптографическими алгоритмами: аргумент algorithm функции указывает, какой алгоритм использовать. Некоторые алгоритмы требуют дополнительных параметров: в таких случаях аргумент algorithm — это объект словаря, содержащий дополнительные параметры.
В таблице ниже показано, какие алгоритмы подходят для каких криптографических операций:
| sign verify | encrypt decrypt | digest | deriveBits deriveKey | wrapKey unwrapKey | generateKey exportKey | importKey | |
|---|---|---|---|---|---|---|---|
| RSASSA-PKCS1-v1_5 | ✓ | ✓ | ✓ | ||||
| RSA-PSS | ✓ | ✓ | ✓ | ||||
| ECDSA | ✓ | ✓ | ✓ | ||||
| Ed25519 | ✓ | ✓ | ✓ | ||||
| HMAC | ✓ | ✓ | ✓ | ||||
| RSA-OAEP | ✓ | ✓ | ✓ | ✓ | |||
| AES-CTR | ✓ | ✓ | ✓ | ✓ | |||
| AES-CBC | ✓ | ✓ | ✓ | ✓ | |||
| AES-GCM | ✓ | ✓ | ✓ | ✓ | |||
| AES-KW | ✓ | ✓ | ✓ | ||||
| SHA-1 | ✓ | ||||||
| SHA-256 | ✓ | ||||||
| SHA-384 | ✓ | ||||||
| SHA-512 | ✓ | ||||||
| ECDH | ✓ | ✓ | ✓ | ||||
| X25519 | ✓ | ✓ | ✓ | ||||
| HKDF | ✓ | ✓ | |||||
| PBKDF2 | ✓ | ✓ |
Спецификации
| Спецификация |
|---|
| Web Cryptography API # subtlecrypto-interface |
Совместимость с браузерами
| Настольные | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
SubtleCrypto |
37 | 12 | 34 | 24 | 117–11.1 | 37 | 34 | 24 | 117–11.3 | 3.0 | 37 |
decrypt |
37 | 7912–79Not supported: AES-CTR. |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
deriveBits |
41 | 7912–79["Not supported: ECDH.", "Not supported: HKDF, PBKDF2."] |
34 | 28 | 11 | 41 | 34 | 28 | 11 | 4.0 | 41 |
deriveKey |
41 | 7912–79["Not supported: ECDH.", "Not supported: HKDF, PBKDF2."] |
34 | 28 | 11 | 41 | 34 | 28 | 11 | 4.0 | 41 |
digest |
4137–41Before version 41, Chrome expected thealgorithm parameter to be an object. |
7912–79Not supported: SHA-1. |
34 | 2824–28Before version 28, Opera expected thealgorithm parameter to be an object. |
7 | 4137–41Before version 41, Chrome Android expected thealgorithm parameter to be an object. |
34 | 2824–28Before version 28, Opera Android expected thealgorithm parameter to be an object. |
7 | 4.03.0–4.0Before version 4.0, Samsung Internet expected thealgorithm parameter to be an object. |
4137–41Before version 41, WebView Android expected thealgorithm parameter to be an object. |
encrypt |
37 | 7912–79Not supported: AES-CTR. |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
exportKey |
37 | 7912–79["Not supported: RSA-PSS, ECDSA, ECDH.", "Not supported: AES-CTR."] |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
generateKey |
37 | 7912–79["Not supported: RSA-PSS, ECDSA, ECDH.", "Not supported: AES-CTR."] |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
importKey |
37 | 7912–79["Not supported: RSA-PSS, ECDSA, ECDH.", "Not supported: AES-CTR, HKDF, PBKDF2."] |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
secure_context_required |
60 | 79 | 75 | 47 | 15 | 60 | 79 | 44 | 15 | 8.0 | 60 |
sign |
37 | 7912–79Not supported: RSA-PSS, ECDSA. |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
unwrapKey |
37 | 7912–79Not supported: AES-CTR. |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
verify |
37 | 7912–79Not supported: RSA-PSS, ECDSA. |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
worker_support |
37 | 79 | 48 | 24 | 11 | 37 | 48 | 24 | 11 | 3.0 | 37 |
wrapKey |
37 | 7912–79Not supported: AES-CTR. |
34 | 24 | 7 | 37 | 34 | 24 | 7 | 3.0 | 37 |
См. также
- Web Crypto API
- Non-cryptographic uses of SubtleCrypto
- Web security
- Privacy, permissions, and information security
-
CryptoиCrypto.subtle. - Crypto 101: вводный курс по криптографии.
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto