SubtleCrypto.digest()

El método digest() de la interfaz SubtleCrypto genera un digest de los datos proveidos. Un digest es un valor corto de longitud fija derivado de alguna entrada de longitud variable. Los digest criptográficos deben mostrar resistencia a colisiones, lo que significa que es difícil encontrar dos entradas diferentes que tengan el mismo valor de digest.

Toma como argumento un identificador para el algoritmo digest a utilizar y los datos a codificar. Devuelve un Promise que se completará con el digest.

Sintaxis

const digest = crypto.subtle.digest(algorithm, data);

Parámetros

  • algorithm es un DOMString definiendo la función hash a utilizar. Los valores admitidos son:
    • SHA-1 (pero no debe utilizarse en aplicaciones criptográficas)
    • SHA-256
    • SHA-384
    • SHA-512
  • data es un ArrayBuffer o ArrayBufferView que contiene los datos a ser digitalizados.

Valor de retorno

Algoritmos soportados

Los argoritmos digest, también conocidos como funciones criptográficas hash, transforman un bloque de datos arbitrariamente grande en una salida de tamaño fijo, normalmente mucho más corta que la entrada. Tienen una variedad de aplicaciones en criptografía.

SHA-1

Este algoritmo se especifica en FIPS 180-4, sección 6.1, y produce una salida de 160 bits de largo.

Advertencia: Este algoritmo se considera ahora vulnerable y no debe utilizarse para aplicaciones criptográficas.

SHA-256

Este algoritmo se especifica en FIPS 180-4, sección 6.2, y produce una salida de 256 bits de largo.

SHA-384

Este algoritmo se especifica en FIPS 180-4, sección 6.5, y produce una salida de 384 bits de largo.

SHA-512

Este algoritmo se especifica en FIPS 180-4, sección 6.4, y produce una salida de 512 bits de largo.

Sugerencia: Si estás buscando aquí cómo crear un código de autenticación de mensajes "keyed-hash" (HMAC), necesitas usar SubtleCrypto.sign() en su lugar.

Ejemplos

Ejemplo básico

Este ejemplo codifica un mensaje, luego calcula su digest SHA-256 y muestra la longitud del mismo:

const text = 'An obscure body in the S-K System, your majesty. The inhabitants refer to it as the planet Earth.';

async function digestMessage(message) {
  const encoder = new TextEncoder();
  const data = encoder.encode(message);
  const hash = await crypto.subtle.digest('SHA-256', data);
  return hash;
}

const digestBuffer = await digestMessage(text);
console.log(digestBuffer.byteLength);

Convirtiendo un digest a una cadena hexadecimal

El resumen se devuelve como un ArrayBuffer, pero para la comparación y visualización los digests se representan a menudo como cadenas hexadecimales. Este ejemplo calcula un digest, y luego convierte el ArrayBuffer a un string hexadecimal:

const text = 'An obscure body in the S-K System, your majesty. The inhabitants refer to it as the planet Earth.';

async function digestMessage(message) {
  const msgUint8 = new TextEncoder().encode(message);                           // encode as (utf-8) Uint8Array
  const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);           // hash the message
  const hashArray = Array.from(new Uint8Array(hashBuffer));                     // convert buffer to byte array
  const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); // convert bytes to hex string
  return hashHex;
}

const digestHex = await digestMessage(text);
console.log(digestHex);

Especificaciones

Especificación Estado Comentario
Web Cryptography API
La definición de 'SubtleCrypto.digest()' 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
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

Leyenda

Soporte completo  
Soporte completo
Soporte parcial  
Soporte parcial
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.

En Chrome 60, se añadió una característica que deshabilita crypto.subtle para conexiones no TLS.

Ver también