SubtleCrypto

La interfaz SubtleCrypto de la Web Crypto API provee una serie de funciones criptográficas de bajo nivel. Se accede a ella a través de las propiedades Crypto.subtle disponible en un contexto de la ventana (via Window.crypto).

Advertencia: Esta API proporciona una serie de primitivos criptográficos de bajo nivel. Es muy fácil hacer un mal uso de ellos, y las trampas involucradas pueden ser muy sutiles.

Incluso suponiendo que se utilicen correctamente las funciones criptográficas básicas, la gestión segura de las claves y el diseño general del sistema de seguridad son extremadamente difíciles de conseguir correctamente, y generalmente son el dominio de expertos en seguridad especializados.

Los errores en el diseño e implementación del sistema de seguridad pueden hacer que la seguridad del sistema sea completamente ineficaz.

Si no estás seguro de saber lo que estás haciendo, probablemente no deberías usar esta API.

Descripción general

Podemos dividir las funciones implementadas por esta API en dos grupos: funciones criptográficas y funciones de administración de claves.

Funciones criptográficas

Estas son las funciones que puedes utilizar para implementar características de seguridad como la privacidad y la autenticación en un sistema. El API de SubtleCrypto proporciona las siguientes funciones criptográficas:

sign()verify(): crea y verifica las firmas digitales.
encrypt() y decrypt(): encripta y desencripta datos.
* digest(): crea un digest de longitud fija y resistente a colisiones de algunos datos.

Funciones de gestión clave

Excepto para digest(), todas las funciones de criptografía de la API utilizan claves criptográficas. En la API SubtleCrypto una clave criptográfica se representa usando un objeto CryptoKey. Para realizar operaciones como firmado y encriptación, provee un objeto CryptoKey a la función sign() o encrypt().

Generando y derivando claves

Las funciones generateKey()deriveKey() ambos crean un nuevo objeto CryptoKey.

La diferencia es que generateKey() generará un nuevo valor clave distinto cada vez que lo llames, mientras que deriveKey() deriva una llave de algún material inicial de claves. Si proporcionas el mismo material de claves a dos llamadas separadas a deriveKey(), obtendrás dos objetos  CryptoKey que tienen el mismo valor de base. Esto es útil si, por ejemplo, se quiere derivar una clave de cifrado de una contraseña y luego derivar la misma clave de la misma contraseña para descifrar los datos.

Importación y exportación de claves

Para hacer que las claves estén disponibles fuera de tu aplicación, necesitas exportar la clave, y para eso sirve exportKey().Puedes elegir uno de varios formatos de exportación.

El inverso de exportKey() es importKey(). Puedes importar claves de otros sistemas, y la compatibilidad con formatos estándar como PKCS #8 y JSON Web Key te ayudan a hacer esto. La función exportKey() exporta la clave en un formato no codificado.

Si la clave es sensible, deberías usar wrapKey(), que exporta la clave y luego la encripta usando otra clave; el API llama a una "llave de envoltura".

El inverso de wrapKey() es unwrapKey(), que descifra y luego importa la llave.

Almacenamiento de claves

Epecification objetos CryptoKey pueden ser almacenados usando el structured clone algorithm, lo que significa que puedes almacenarlos y recuperarlos usando las API de almacenamiento web estándar. La especificación espera que la mayoría de los desarrolladores usen el IndexedDB API para almacenar objetos CryptoKey.

Algoritmos Suportados

Las funciones criptográficas que proporciona la Web Crypto API pueden ser realizadas por uno o más algoritmos criptográficos diferentes: El argumento algorithm de la función indica el algoritmo a utilizar. Algunos algoritmos necesitan parámetros adicionales: en estos casos el argumento algorithm es un objeto de diccionario que incluye los parámetros adicionales.

En el cuadro que figura a continuación se resume qué algoritmos son adecuados para cada operación criptográfica:

sign()

verify()

encrypt()

decrypt()

digest()

deriveBits()

deriveKey()

wrapKey()

unwrapKey()

RSASSA-PKCS1-v1_5
RSA-PSS
ECDSA
HMAC
RSA-OAEP
AES-CTR
AES-CBC
AES-GCM
SHA-1
SHA-256
SHA-384
SHA-512
ECDH
HKDF
PBKDF2
AES-KW

Propiedades

Esta interfaz no hereda ni implementa ninguna propiedad.

Métodos

Esta interfaz no hereda ningún método.

SubtleCrypto.encrypt()
Retorna un Promise que se completa con los datos codificados correspondientes al texto sin cifrar, el algoritmo y la clave dados como parámetros.
SubtleCrypto.decrypt()
Retorna un Promise que se completa con los datos claros correspondientes al texto encriptado, el algoritmo y la clave dados como parámetros.
SubtleCrypto.sign()
Retorna un Promise que se completa con la firma correspondiente al texto, algoritmo y clave dados como parámetros.
SubtleCrypto.verify()
Retorna un Promise que se completa con un valor Boolean indicando si la firma dada como parámetro coincide con el texto, el algoritmo y la clave que también se dan como parámetros.
SubtleCrypto.digest()
Retorna un Promise que se completa con digest generado a partir del algoritmo y el texto dados como parámetros.
SubtleCrypto.generateKey()
Retorna un Promise que se completa con un recién generado CryptoKey, para algoritmos simétricos, o un CryptoKeyPair, que contiene dos claves recién generadas, para algoritmos asimétricos. Estas coincidirán con el algoritmo, usos y extraíbles dados como parámetros.
SubtleCrypto.deriveKey()
Retorna un Promise que se completa con un recién generado CryptoKey derivado de la clave maestra y el algoritmo específico dados como parámetros.
SubtleCrypto.deriveBits()
Retorna un Promise que se completa con un recién generado buffer de bits pseudo-aleatorios derivado de la clave maestra y el algoritmo específico dados como parámetros.
SubtleCrypto.importKey()
Retorna un Promise que se completa con un CryptoKey correspondiente al formato, el algoritmo, los datos clave en bruto, los usos y la extraíbilidad dados como parámetros.
SubtleCrypto.exportKey()
Retorna un Promise que se completa con un buffer que contiene la clave en el formato solicitado.
SubtleCrypto.wrapKey()
Retorna un Promise que se completa con una llave simétrica envuelta para su uso (transferencia y almacenamiento) en entornos inseguros. La llave envuelta coincide con el formato especificado en los parámetros dados, y la envoltura se hace con la llave envuelta dada, usando el algoritmo especificado.
SubtleCrypto.unwrapKey()
Retorna un Promise que se completa con un CryptoKey correspondiente a la llave envuelta dada en el parámetro.

Especificaciones

Especificación Estado Comentario
Web Cryptography API
La definición de 'SubtleCrypto' en esta especificación.
Recommendation Definición inicial.

Compatibilidad del navegador

Update compatibility data on GitHub
DesktopMobile
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome para AndroidFirefox para AndroidOpera para AndroidSafari en iOSSamsung Internet
SubtleCryptoChrome Soporte completo 37Edge Soporte parcial 12Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11Opera Soporte completo 24Safari Soporte completo 10.1
Soporte completo 10.1
Soporte completo 7
Prefijado
Prefijado Requiere de un prefijo de vendedor : WebKit
WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 10.3
Soporte completo 10.3
Soporte completo 7
Prefijado
Prefijado Requiere de un prefijo de vendedor : WebKit
Samsung Internet Android Soporte completo 6.0
decryptChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: AES-CTR.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns CryptoOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
deriveBitsChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: ECDH.
Notas Not supported: HKDF, PBKDF2.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Sin soporte NoOpera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
deriveKeyChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: ECDH.
Notas Not supported: HKDF, PBKDF2.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Sin soporte NoOpera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
digestChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: SHA-1.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns CryptoOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
encryptChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: AES-CTR.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns CryptoOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
exportKeyChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: RSA-PSS, ECDSA, ECDH.
Notas Not supported: AES-CTR.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns KeyOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
generateKeyChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: RSA-PSS, ECDSA, ECDH.
Notas Not supported: AES-CTR.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns KeyOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
importKeyChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: RSA-PSS, ECDSA, ECDH.
Notas Not supported: AES-CTR, HKDF, PBKDF2.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns KeyOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
Secure context requiredChrome Soporte completo 60Edge Soporte completo 79Firefox Soporte completo 75IE Sin soporte NoOpera Soporte completo 47Safari Sin soporte NoWebView Android Soporte completo 60Chrome Android Soporte completo 60Firefox Android Sin soporte NoOpera Android Soporte completo 47Safari iOS Sin soporte NoSamsung Internet Android Sin soporte No
signChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: RSA-PSS, ECDSA.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns CryptoOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
unwrapKeyChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: AES-CTR.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns KeyOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android ? Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
verifyChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: RSA-PSS, ECDSA.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns CryptoOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0
Available in workersChrome ? Edge ? Firefox Soporte completo 48IE ? Opera ? Safari ? WebView Android ? Chrome Android ? Firefox Android ? Opera Android ? Safari iOS ? Samsung Internet Android ?
wrapKeyChrome Soporte completo 37Edge Soporte parcial 12
Notas
Soporte parcial 12
Notas
Notas Not supported: AES-CTR.
Firefox Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns KeyOperation instead of Promise
Opera Soporte completo 24Safari Soporte completo 7WebView Android Soporte completo 37Chrome Android Soporte completo 37Firefox Android Soporte completo 34
Soporte completo 34
Sin soporte 32 — 34
Deshabilitado
Deshabilitado From version 32 until version 34 (exclusive): this feature is behind the dom.webcrypto.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Opera Android Soporte completo 24Safari iOS Soporte completo 7Samsung Internet Android Soporte completo 6.0

Leyenda

Soporte completo  
Soporte completo
Soporte parcial  
Soporte parcial
Sin soporte  
Sin soporte
Compatibilidad desconocida  
Compatibilidad desconocida
Ver notas de implementación.
Ver notas de implementación.
El usuario debe de habilitar explícitamente esta característica.
El usuario debe de habilitar explícitamente esta característica.
Requiere de un prefijo de proveedor o un de nombre diferente para su uso.
Requiere de un prefijo de proveedor o un de nombre diferente para su uso.

Ver también