Web Crypto API
==============

**Experimental:** **Esta es una tecnología experimental**  
Comprueba la Tabla de compabilidad de navegadores cuidadosamente antes de usarla en producción.

La **Web Crypto API** es una interfaz que permite a un script usar primitivos criptográficos con el fin de construir sistemas utilizando criptografía.

**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.**

Una de las principales características de esta API es que permite la manipulación y almacenamiento de claves privadas y secretas sin la capa de bits de la clave para poder usarlo con Javascript.

Esta interfaz permite el acceso a las siguientes primitivos:

* ***digest***, la capacidad para calcular un hash de un bloque arbitrario de datos, con el fin de detectar cualquier cambio en él.
* ***mac***, la capacidad de calcular un código de mensaje de autenticación.
* ***sign*** and ***verify***, la capacidad de firmar digitalmente un documento, y de verificar una firma.
* ***encrypt*** and ***decrypt***, la capacidad de codificar o descodificar un documento.
* ***import*** and ***export***, la capacidad de importar o exportar una clave.
* ***key generation***, la capacidad de crear una llave criptográfica segura o un par de llaves (llave pública y llave privada), sin el uso de una clave base, pero usando la entropía disponible en el sistema local.
* ***key wrapping*** and ***unwrapping***, la capacidad de transmitir y recibir una llave de un tercero, codificada usando otra llave sin exponer dicha llave a JavaScript.
* ***random***, la capacidad de generar criptográficamente números pseudo-aleatorios fuertes.

La Web Crypto API no resuelve todos los problemas criptográficos a los que un sitio web o una aplicación puedan encontrarse:

* No flexibiliza el modelo de same-origin security model del navegador, como los casos en que las claves son emitidas por entidades centralizadas utilizadas por varios sitios web.
* No interactúa con hardware dedicado, tal y como smart cards, pendrives, o generadores aleatorios.

**Advertencia:** **¡Atención!**

* El simple hecho de hacer uso de la criptografía no hace a tu sistema seguro. La Seguridad es un **proceso** que constamentemente evalua el riesgo de un sistema en el contexto de uso. The context and the risks experienced evolve over time.
* Al aplicar seguridad, todo el **sistema** debe considerarse. En el caso de la Web Crypto API, los desarrolladores Web no sólo deben considerar la seguridad del script, sino también la seguridad de la conexión al servidor y los datos que éste podría comunicar sin encriptar. La seguridad en general será tan débil como la parte más débil de todo el sistema.

Interfaces
----------

 Algunos navegadores implementan una interfaz llamada `Crypto` sin tenerla bien definida o criptográficamente siendo llamada. Con el fin de evitar conclusiones, los métodos y propiedades de esta interfaz van a ir implementados en la Web Crypto API, y todos los métodos de la Web Crypto API están disponibles en una nueva interfaz: `SubtleCrypto`.
 La propiedad `Crypto.subtle` da acceso a un objeto para implementarla.

Casos de uso
------------

La Web Crypto API puede ser usada para:

* Verificar que los datos no han sido alterados por terceros. Incluso si los datos se almacenan de forma clara, el almacenamiento de una firma, generada a partir de una contraseña, permite a las personas que conocen la contraseña saber que es auténtica.
Especificaciones
----------------

| Specification |
| --- |
| Web Cryptography API # crypto-interface |