Migrando do Node.js crypto para a Web Crypto API: Uma experiência guiada
Aprofunde-se na experiência de transição do crypto para a Web Crypto API, fornecendo um guia abrangente focando em 3 cenários comuns.
Introdução
A Web Crypto API é uma nova ferramenta Javascript para criptografia. É compatível com navegadores modernos e plataformas líderes, incluindo [Cloudflare Workers] (https://workers.cloudflare.com/) e [Vercel] (https://vercel.com), além do Node.js. Essa interoperabilidade implica o sonho de um desenvolvedor - escreva seu código de criptografia apenas uma vez e execute-o em várias plataformas usando a Web Crypto API.
No entanto, o Node.js já tem um módulo "crypto" com uma longa história, deixando uma quantidade significativa de código legado que precisa de migração. Neste artigo, vamos mergulhar na experiência de transição, fornecendo um guia abrangente focando em 3 cenários comuns. Nosso objetivo é iluminar o caminho para uma migração bem-sucedida.
O que é a Web Crypto API
A Web Crypto API é um padrão aberto do W3C para JavaScript, é uma coleta de primitivas de criptografia padronizadas definidas na especificação da Web Cryptography API. Foi criado após vários browsers e plataformas começarem a adicionar suas próprias funções de criptografia não interoperáveis.
A API fornece primitivas para geração de chave, codificação e decodificação, assinaturas digitais, chave e derivação de bits, e digestão criptográfica. É centrado em uma interface chamada SubtleCrypto, você pode encontrar mais detalhes e tutoriais na documentação da Mozilla MDN.
Mas o Node.js já tem o módulo crypto?
Os desenvolvedores do Node.js estão normalmente familiarizados com o [módulo crypto] (https://nodejs.org/api/crypto.html). Oferece um conjunto completo de primitivas criptográficas. Este módulo não apenas fornece mecanismos para as mesmas operações criptográficas definidas na Web Crypto API, mas geralmente inclui uma gama mais ampla de algoritmos criptográficos.
Então, por que ainda precisamos da Web Crypto API? À medida que o Javascript se torna popular em muitas plataformas e ambientes, do lado do cliente aos servidores e especialmente na borda, é importante ter uma ferramenta criptográfica multiplataforma para simplificar processos.
Além disso, as funções na norma Web Crypto API retornam todas as promessas e suportam a sintaxe async/await. Isso é uma vantagem significativa sobre o módulo crypto, que é síncrono e pode bloquear o loop de eventos.
E há uma coisa interessante de que o Node.js adiciona seu suporte para a Web Crypto API, ou seja, na maioria dos casos, a Web Crypto API é perfeita na maioria das plataformas conhecidas.
Usando a Web Crypto API
Na maioria das plataformas, a coleção de APIs da Web Crypto é acessível através do objeto global crypto
, que inclui 3 utilitários de alto nível: getRandomValues
, randomUUID
e subtle
.
Existem muitas diferenças em relação ao módulo crypto tradicional. Eles podem ser resumidos nas 3 partes mais comuns. Vamos passar por eles e ver como migrar do código existente.
#1 Gerar valores aleatórios
No módulo crypto, você pode gerar valores aleatórios chamando randomBytes
Existe uma função similar chamada getRandomValues
na Web Crypto, mas o valor de retorno é um ArrayBuffer
, então precisamos de uma etapa adicional para convertê-lo em string.
#2 Hash (ou digest)
createHash
é fácil de usar no módulo crypto.
No Web Crypto, podemos usar subtle.createHash
Como você pode ver, a transformação de ArrayBuffer
para string hex também é necessária.
#3 Codificação e decifração
No módulo crypto, a codificação e decodificação AES podem ser implementadas com:
No Web Crypto, precisamos criar a chave com importKey
primeiro:
Conclusão
Como você pode ver, a migração não é difícil, a principal tarefa é mudar a sintaxe para se adequar à nova API e resolver ArrayBuffer
com TextEncoder
.
Como um produto de identidade, o Logto usa criptografia em muitos lugares. Nós migrámos do módulo crypto para a Web Crypto API. Essa transição nos permite nos adaptar melhor aos ambientes de borda e torna possível executar o código SDK de forma segura no navegador.