--- title: SubtleCrypto slug: Web/API/SubtleCrypto tags: - API - Interfaz - Referencia - SubtleCrypto - Web Crypto API translation_of: Web/API/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 {{domxref("Crypto.subtle")}} disponible en un contexto de la ventana (via {{domxref("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.
Podemos dividir las funciones implementadas por esta API en dos grupos: funciones criptográficas y funciones de administración de claves.
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:
* {{DOMxRef("SubtleCrypto.sign","sign()")}} y {{DOMxRef("SubtleCrypto.verify","verify()")}}: crea y verifica las firmas digitales.
* {{DOMxRef("SubtleCrypto.encrypt","encrypt()")}} y {{DOMxRef("SubtleCrypto.decrypt","decrypt()")}}: encripta y desencripta datos.
* {{DOMxRef("SubtleCrypto.digest","digest()")}}: crea un digest de longitud fija y resistente a colisiones de algunos datos.
Excepto para {{DOMxRef("SubtleCrypto.digest","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 {{DOMxRef("CryptoKey","CryptoKey")}}. Para realizar operaciones como firmado y encriptación, provee un objeto {{DOMxRef("CryptoKey","CryptoKey")}} a la función {{DOMxRef("SubtleCrypto.sign","sign()")}} o {{DOMxRef("SubtleCrypto.encrypt","encrypt()")}}.
Las funciones {{DOMxRef("SubtleCrypto.generateKey","generateKey()")}} y {{DOMxRef("SubtleCrypto.deriveKey","deriveKey()")}} ambos crean un nuevo objeto {{DOMxRef("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.
Para hacer que las claves estén disponibles fuera de tu aplicación, necesitas exportar la clave, y para eso sirve {{DOMxRef("SubtleCrypto.exportKey","exportKey()")}}.Puedes elegir uno de varios formatos de exportación.
El inverso de exportKey()
es {{DOMxRef("SubtleCrypto.importKey","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 {{DOMxRef("SubtleCrypto.wrapKey","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 {{DOMxRef("SubtleCrypto.unwrapKey","unwrapKey()")}}, que descifra y luego importa la llave.
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
.
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:
digest() | |||||
---|---|---|---|---|---|
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 | ✓ |
Esta interfaz no hereda ni implementa ninguna propiedad.
Esta interfaz no hereda ningún método.
Especificación | Estado | Comentario |
---|---|---|
{{ SpecName('Web Crypto API', '#subtlecrypto-interface', 'SubtleCrypto') }} | {{ Spec2('Web Crypto API') }} | Definición inicial. |
{{Compat("api.SubtleCrypto")}}