Mensagem de erro
NotSupportedError: Unrecognized algorithm name
Texto do Node; o Node também informa “Unrecognized namedCurve” para curvas desconhecidas. O Chrome imprime “Failed to execute 'generateKey' on 'SubtleCrypto': Algorithm: Unrecognized name”, o Firefox, “Operation is not supported”, e o Safari, “The operation is not supported.” — a parte estável é o nome da DOMException, NotSupportedError.
WebCrypto crypto.subtle — browsers & Node
O que significa
O algoritmo (ou a curva) que você indicou não está entre os que esta implementação do WebCrypto oferece. Ou o identificador tem um erro de digitação, ou você pediu algo que de fato está fora do conjunto padrão — na maioria das vezes, a secp256k1, que o WebCrypto não inclui, embora seja uma curva EC como as da família P-*. A verificação acontece antes de qualquer material de chave ser usado, então a mesma chamada funciona assim que o nome é corrigido.
Por que acontece
A curva secp256k1 solicitada ao WebCrypto
comumCódigo de Bitcoin/Ethereum muitas vezes supõe que namedCurve: "secp256k1" vai funcionar como P-256. Nunca funcionou: o registro do WebCrypto cobre apenas P-256, P-384 e P-521. (O módulo crypto do Node fora do WebCrypto oferece, sim, suporte à secp256k1.)
Nomes no estilo JWT usados como nomes de algoritmo
comum“ES256”, “RS256” ou “ECDSA_P256_SHA256” são identificadores do JOSE ou de outros ecossistemas. O WebCrypto espera { name: "ECDSA", namedCurve: "P-256" } para chaves e { name: "ECDSA", hash: "SHA-256" } para operações.
Algoritmos mais novos em runtimes mais antigos
ocasionalEd25519/X25519 chegaram ao WebCrypto entre 2023 e 2025; navegadores mais antigos, versões antigas do Node e algumas WebViews ainda os rejeitam. Detecte o suporte antes de depender deles.
Como corrigir
- 1.
Usar os identificadores exatos do WebCrypto
Os nomes são comparados sem diferenciar maiúsculas de minúsculas, mas precisam ser os registrados — e os nomes de curva precisam ser exatos. Repare nos dois dicionários: generateKey/importKey recebem namedCurve, enquanto sign/verify recebem hash; confundir os dois é uma variante própria deste erro.
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 uma biblioteca
Nos navegadores, o caminho padrão é uma implementação auditada em JS puro; no Node, o módulo crypto embutido (fora do WebCrypto) oferece suporte nativo à curva, então o código de servidor tem duas opções.
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" });