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 focado 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 e Vercel, e também Node.js. Tal interoperabilidade implica o sonho de um desenvolvedor - escreva seu código de criptografia uma vez e execute-o em várias plataformas usando a Web Crypto API.
Entretanto, Node.js já tem um módulo "crypto" com uma longa história, deixando uma quantidade significativa de código legado em necessidade 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 é Web Crypto API
Web Crypto API, um padrão aberto pelo W3C para JavaScript, é uma coleção de primitivas de criptografia padronizadas definidas na especificação da API de criptografia Web. Foi criada depois que vários navegadores e plataformas começaram a adicionar suas próprias funções de criptografia não interoperáveis.
A API fornece primitivas para geração de chaves, criptografia e descriptografia, assinaturas digitais, derivação de chaves e bits, e digestão criptográfica. É centrada em torno de uma interface chamada SubtleCrypto, você pode encontrar mais detalhes e tutoriais na documentação da Mozilla MDN.
Mas Node.js já tem módulo de criptografia?
Desenvolvedores de Node.js geralmente estão familiarizados com o módulo de criptografia. Ele oferece um conjunto abrangente de primitivas criptográficas. Este módulo não apenas oferece mecanismos para as mesmas operações criptográficas definidas na Web Crypto API, mas muitas vezes inclui uma variedade maior de algoritmos criptográficos.
Então por que ainda precisamos da Web Crypto API? À medida que o Javascript se populariza em muitas plataformas e ambientes, desde o lado do cliente até servidores e especialmente na borda, é importante ter uma ferramenta criptográfica multiplataforma para simplificar processos.
Além disso, as funções na Web Crypto API padrão retornam todas as promessas e suportam a sintaxe async/await. Isso é uma vantagem significativa sobre o módulo de criptografia, que é síncrono e pode bloquear o loop de eventos.
E há uma coisa interessante que o Node.js adiciona seu suporte para a Web Crypto API, o que significa, na maioria dos casos, a Web Crypto API é perfeita na maioria das plataformas conhecidas.
Usando Web Crypto API
Na maioria das plataformas, a coleção de Web Crypto APIs é acessível via o objeto global crypto
, que inclui 3 utilitários de nível superior: getRandomValues
, randomUUID
e subtle
.
Existem muitas diferenças em comparação com o módulo de criptografia tradicional. Eles podem ser resumidos em 3 partes mais comuns. Vamos passar por eles e ver como migrar do código existente.
#1 Gerar valores aleatórios
No módulo de criptografia, você pode gerar valores aleatórios chamando randomBytes
Há uma função semelhante chamada getRandomValues
na Web Crypto, mas o valor de retorno é um ArrayBuffer
, portanto precisamos de um passo adicional para convertê-lo em string.
#2 Hashing (ou digest)
createHash
é fácil de usar no módulo de criptografia:
Na Web Crypto, podemos usar subtle.createHash
Como você pode ver, também é necessária a transformação de ArrayBuffer
para string hex.
#3 Criptografia e descriptografia
No módulo de criptografia, a criptografia e a descriptografia AES podem ser implementadas com:
Na Web Crypto, precisamos criar uma chave com importKey
primeiro:
Conclusão
Como você pode ver, a migração não é difícil, o trabalho principal é mudar a sintaxe para se adaptar à nova API e resolver ArrayBuffer
com TextEncoder
.
Como um produto de identidade, Logto usa criptografia em muitos lugares. Migramos do módulo de criptografia para a Web Crypto API. Esta transição nos permite nos adaptar melhor aos ambientes de borda e torna possível a execução segura do código do SDK no navegador.