SubtleCrypto
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since septiembre de 2017.
* Some parts of this feature may have varying levels of support.
Contexto seguro: Esta función está disponible solo en contextos seguros (HTTPS), en algunos o todos los navegadores que lo soportan.
Nota: Esta característica está disponible en Web Workers.
La interfaz SubtleCrypto de la Web Crypto API proporciona una serie de funciones criptográficas de bajo nivel.
El nombre de la interfaz incluye el término "subtle" (sutil) para indicar que muchos de sus algoritmos tienen requisitos de uso sutiles y que, por lo tanto, debe utilizarse con cuidado para ofrecer garantías de seguridad adecuadas.
Una instancia de SubtleCrypto está disponible a través de la propiedad subtle de la interfaz Crypto, la cual se encuentra disponible en ventanas mediante Window.crypto y en workers a través de la propiedad WorkerGlobalScope.crypto.
Advertencia: Esta API proporciona una serie de primitivas criptográficas de bajo nivel. Es muy fácil hacer un mal uso de ellas, y los riesgos que conlleva pueden ser muy sutiles.
Incluso suponiendo que las funciones criptográficas básicas se utilicen correctamente, la gestión segura de las claves y el diseño general del sistema de seguridad son extremadamente difíciles de implementar de forma adecuada y, por lo general, son competencia de expertos especializados en seguridad.
Los errores en el diseño e implementación del sistema de seguridad pueden hacer que la seguridad del sistema sea completamente ineficaz.
Por favor, aprende y experimenta, pero no garantices ni insinúes la seguridad de tu trabajo antes de que una persona con conocimientos en esta materia lo revise exhaustivamente. El curso Crypto 101 puede ser un excelente punto de partida para aprender sobre el diseño e implementación de sistemas seguros.
Propiedades de instancia
Esta interfaz no hereda ni implementa ninguna propiedad.
Métodos de instancia
Esta interfaz no hereda ningún método.
SubtleCrypto.encrypt()-
Retorna un
Promiseque se completa con los datos codificados correspondientes al texto sin cifrar, el algoritmo y la clave dados como parámetros. SubtleCrypto.decrypt()-
Retorna un
Promiseque se completa con los datos claros correspondientes al texto encriptado, el algoritmo y la clave dados como parámetros. SubtleCrypto.sign()-
Retorna un
Promiseque se completa con la firma correspondiente al texto, algoritmo y clave dados como parámetros. SubtleCrypto.verify()-
Retorna un
Promiseque se completa con un valorBooleanindicando 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
Promiseque se completa con el digest generado a partir del algoritmo y el texto dados como parámetros. SubtleCrypto.generateKey()-
Retorna un
Promiseque se completa con un recién generadoCryptoKey, para algoritmos simétricos, o unCryptoKeyPair, 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
Promiseque se completa con un recién generadoCryptoKeyderivado de la clave maestra y el algoritmo específico dados como parámetros. SubtleCrypto.deriveBits()-
Retorna un
Promiseque 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
Promiseque se completa con unCryptoKeycorrespondiente al formato, el algoritmo, los datos clave en bruto, los usos y la extraíbilidad dados como parámetros. SubtleCrypto.exportKey()-
Retorna un
Promiseque se completa con un buffer que contiene la clave en el formato solicitado. SubtleCrypto.wrapKey()-
Retorna un
Promiseque se completa con una clave simétrica envuelta para su uso (transferencia y almacenamiento) en entornos inseguros. La clave envuelta coincide con el formato especificado en los parámetros dados, y la envoltura se hace con la clave envuelta dada, usando el algoritmo especificado. SubtleCrypto.unwrapKey()-
Retorna un
Promiseque se completa con unCryptoKeycorrespondiente a la clave envuelta dada en el parámetro.
Uso de SubtleCrypto
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:
Funciones de gestión de claves
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() y deriveKey() ambas 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 clave 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; la API la llama "clave de envoltura".
El inverso de wrapKey() es unwrapKey(), que descifra y luego importa la clave.
Almacenamiento de claves
CryptoKey es un objeto serializable, lo que permite que las claves se almacenen y recuperen utilizando las API de almacenamiento web estándar.
La especificación espera que la mayoría de los desarrolladores utilicen la API IndexedDB, almacenando los objetos CryptoKey asociados a algún identificador de cadena clave que sea significativo para la aplicación, junto con cualquier otro metadato que consideren útil.
Esto permite el almacenamiento y la recuperación de la CryptoKey sin tener que exponer su material de clave subyacente a la aplicación o al entorno de JavaScript.
Algoritmos soportados
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 |
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 | ✓ | ✓ |
Especificaciones
| Specification |
|---|
| Web Cryptography Level 2> # subtlecrypto-interface> |
Compatibilidad con navegadores
Véase también
- Web Crypto API
- Usos no criptográficos de SubtleCrypto
- Seguridad web
- Privacidad, permisos y seguridad de la información
CryptoyCrypto.subtle.- Crypto 101: un curso de introducción a la criptografía (en inglés).