Esta página ha sido traducida del inglés por la comunidad. Aprende más y únete a la comunidad de MDN Web Docs.

View in English Always switch to English

SubtleCrypto: método generateKey()

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since enero de 2020.

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

El método generateKey() de la interfaz SubtleCrypto se utiliza para generar una nueva clave (para algoritmos simétricos) o un par de claves (para algoritmos de clave pública).

Sintaxis

js
generateKey(algorithm, extractable, keyUsages)

Parámetros

algorithm

Un objeto que define el tipo de clave que se va a generar y proporciona parámetros adicionales específicos del algoritmo.

extractable

Un valor booleano que indica si será posible exportar la clave utilizando SubtleCrypto.exportKey() o SubtleCrypto.wrapKey(). Tenga en cuenta que al generar un par de claves asimétricas (como una RSA o ECDSA), el parámetro extractable determina si la clave privada se puede exportar; la clave pública siempre es extraíble.

keyUsages

Un Array de cadenas de texto que indica qué se puede hacer con las claves recién generadas. Los valores posibles de los elementos del array son:

encrypt

La clave se puede usar para cifrar mensajes.

decrypt

La clave se puede usar para descifrar mensajes.

sign

La clave se puede usar para firmar mensajes.

verify

La clave se puede usar para verificar firmas.

deriveKey

La clave se puede usar para generar una nueva clave.

deriveBits

La clave se puede usar para derivar bits.

wrapKey

La clave se puede usar para envolver una clave.

unwrapKey

La clave se puede usar para desenvolver una clave.

Valor de retorno

Un objeto Promise que se resuelve con un CryptoKey (para algoritmos simétricos) o una CryptoKeyPair (para algoritmos de clave pública).

Excepciones

La promesa se rechaza cuando se presentan las siguientes excepciones:

SyntaxError DOMException

Se lanza cuando el resultado es un CryptoKey de tipo secret o private pero keyUsages está vacío o no es válido para el tipo de algoritmo.

SyntaxError DOMException

Se lanza cuando el resultado es un CryptoKeyPair y su atributo privateKey.usages está vacío o no es válido para el tipo de algoritmo.

Ejemplos

Nota: Puedes probar los ejemplos prácticos en GitHub.

Generación de un par de claves RSA

Este código genera un par de claves de cifrado RSA-OAEP. Consulta el código completo en GitHub.

js
let keyPair = await window.crypto.subtle.generateKey(
  {
    name: "RSA-OAEP",
    modulusLength: 4096,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: "SHA-256",
  },
  true,
  ["encrypt", "decrypt"],
);

Generación de un par de claves de curva elíptica

Este código genera un par de claves de firma ECDSA. Consulta el código completo en GitHub.

js
let keyPair = await window.crypto.subtle.generateKey(
  {
    name: "ECDSA",
    namedCurve: "P-384",
  },
  true,
  ["sign", "verify"],
);

Generación de clave HMAC

Este código genera una clave de firma HMAC. Consulta el código completo en GitHub.

js
let key = await window.crypto.subtle.generateKey(
  {
    name: "HMAC",
    hash: { name: "SHA-512" },
  },
  true,
  ["sign", "verify"],
);

Generación de clave AES

Este código genera una clave de cifrado AES-GCM. Consulta el código completo en GitHub.

js
let key = await window.crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256,
  },
  true,
  ["encrypt", "decrypt"],
);

Generación de claves Ed25519

Este código genera un par de claves de firma Ed25519. Se deriva de este código fuente en GitHub, que puedes ver en directo aquí.

JavaScript

A continuación se muestra el código para generar un par de claves utilizando el algoritmo Ed25519 y registrar la información de cada clave. Tenga en cuenta que el código se ejecuta dentro de un bloque try..catch ya que no todos los navegadores admiten este algoritmo.

El código JavaScript primero obtiene los elementos #sign-button y #message <input> y luego añade un detector de evento "click" en el botón. El manejador de evento borra el registro y ejecuta las demás operaciones pasando el contenido del elemento <input>.

js
const button = document.querySelector("#run-button");
const input = document.querySelector("#log");

button.addEventListener("click", () => {
  // Borra los registros
  logElement.innerText = "";
  logElement.scrollTop = logElement.scrollHeight;
  // Ejecuta la función test
  test();
});

async function test() {
  try {
    // Crea un par de claves y usa desestructuración para asignarlas a las variables.
    const { publicKey, privateKey } = await crypto.subtle.generateKey(
      {
        name: "Ed25519",
      },
      true,
      ["sign", "verify"],
    );

    // Muestra las propiedades de las claves
    log(`Clave pública: ${publicKey}`);
    log(`Tipo: ${publicKey.type}`);
    log(`Extraíble: ${publicKey.extractable}`);
    log(`Algoritmo: ${JSON.stringify(publicKey.algorithm)}`);
    log(`Usos: ${publicKey.usages}`);
    log(`Clave privada: ${privateKey}`);
    log(`Tipo: ${privateKey.type}`);
    log(`Extraíble: ${privateKey.extractable}`);
    log(`Algoritmo: ${JSON.stringify(privateKey.algorithm)}`);
    log(`Usos: ${privateKey.usages}`);
  } catch (error) {
    log(error);
  }
}

Resultado

La información sobre las claves creadas se muestra a continuación (o un mensaje de error en el navegador si no permite crear la clave).

Generación de clave X25519

Este código genera un par de claves pública y privada X25519 que se puede utilizar en SubtleCrypto.deriveKey() para crear una clave compartida o en SubtleCrypto.deriveBits() para crear un secreto compartido.

JavaScript

A continuación se muestra el código para generar un par de claves utilizando el algoritmo X25519 y registrar la información de cada clave. Tenga en cuenta que el código se ejecuta dentro de un bloque try..catch ya que no todos los navegadores admiten este algoritmo.

El código JavaScript primero obtiene los elementos #run-button y #log <input>, luego agrega un detector de evento click en el botón. El manejador de evento borra el registro, genera un par de claves X25519 y registra algunas de sus propiedades.

js
const button = document.querySelector("#run-button");
const input = document.querySelector("#log");

button.addEventListener("click", () => {
  // Borra los registros
  logElement.innerText = "";
  logElement.scrollTop = logElement.scrollHeight;
  // Ejecuta función test
  test();
});

async function test() {
  try {
    // Crea un par de claves y usa desestructuración para asignarlas a las variables.
    const { publicKey, privateKey } = await crypto.subtle.generateKey(
      {
        name: "X25519",
      },
      true,
      ["deriveKey", "deriveBits"],
    );

    // Registra las propiedades de las claves
    log(`Clave pública: ${publicKey}`);
    log(`Tipo: ${publicKey.type}`);
    log(`Extraíble: ${publicKey.extractable}`);
    log(`Algoritmo: ${JSON.stringify(publicKey.algorithm)}`);
    log(`Uso: ${publicKey.usages}`);
    log(`Clave privada: ${privateKey}`);
    log(`Tipo: ${privateKey.type}`);
    log(`Extraíble: ${privateKey.extractable}`);
    log(`Algoritmo: ${JSON.stringify(privateKey.algorithm)}`);
    log(`Uso: ${privateKey.usages}`);
  } catch (error) {
    log(error);
  }
}

Resultado

A continuación se registra la información sobre las claves creadas (o un mensaje de error si el navegador no permite crear la clave).

Especificaciones

Specification
Web Cryptography Level 2
# SubtleCrypto-method-generateKey

Compatibilidad con navegadores

Véase también