Mensaje de error
NotSupportedError: Unrecognized algorithm name
Es el texto de Node; con curvas desconocidas, Node también muestra «Unrecognized namedCurve». Chrome imprime «Failed to execute 'generateKey' on 'SubtleCrypto': Algorithm: Unrecognized name»; Firefox, «Operation is not supported», y Safari, «The operation is not supported.»; la parte estable es el nombre de la DOMException, NotSupportedError.
WebCrypto crypto.subtle — browsers & Node
Qué significa
El algoritmo (o la curva) que indicas no está entre los que ofrece esta implementación de WebCrypto. O el identificador tiene una errata, o pides algo que de verdad está fuera del conjunto estándar; lo más habitual es secp256k1, que WebCrypto no incluye a pesar de ser una curva EC como las de la familia P-*. La comprobación se ejecuta antes de tocar ningún material de clave, así que la misma llamada funciona en cuanto se corrige el nombre.
Por qué ocurre
secp256k1 solicitada a WebCrypto
frecuenteEl código de Bitcoin/Ethereum suele dar por hecho que namedCurve: "secp256k1" funcionará igual que P-256. Nunca ha sido así: el registro de WebCrypto solo cubre P-256, P-384 y P-521. (El módulo crypto de Node ajeno a WebCrypto sí admite secp256k1).
Nombres al estilo de JWT usados como nombres de algoritmo
frecuente«ES256», «RS256» o «ECDSA_P256_SHA256» son identificadores de JOSE o de otros ecosistemas. WebCrypto espera { name: "ECDSA", namedCurve: "P-256" } para las claves y { name: "ECDSA", hash: "SHA-256" } para las operaciones.
Algoritmos nuevos en entornos de ejecución antiguos
ocasionalEd25519/X25519 llegaron a WebCrypto entre 2023 y 2025; los navegadores y las versiones de Node más antiguos, y algunos WebView, todavía los rechazan. Detecta si están disponibles antes de depender de ellos.
Cómo solucionarlo
- 1.
Usar los identificadores exactos de WebCrypto
Los nombres se comparan sin distinguir mayúsculas y minúsculas, pero deben ser los registrados, y los nombres de curva se comparan de forma exacta. Fíjate en los dos diccionarios: generateKey/importKey reciben namedCurve, mientras que sign/verify reciben hash; confundirlos es una variante propia de este error.
js const key = await crypto.subtle.generateKey( { name: "ECDSA", namedCurve: "P-256" }, // not "ES256", not "secp256r1" false, ["sign", "verify"], ); const sig = await crypto.subtle.sign({ name: "ECDSA", hash: "SHA-256" }, key.privateKey, data); - 2.
Para secp256k1, usar una biblioteca
En los navegadores, lo habitual es una implementación auditada en JS puro; en Node, el módulo crypto integrado (ajeno a WebCrypto) maneja la curva de forma nativa, así que el código del servidor tiene dos opciones.
js // browser: @noble/curves (audited, dependency-free) import { secp256k1 } from "@noble/curves/secp256k1"; const ok = secp256k1.verify(signature, msgHash, publicKey); // node: built-in crypto.generateKeyPairSync("ec", { namedCurve: "secp256k1" });