Pular para o conteúdo principal
Change page

Definição de armazenamento secreto Web3

Última atualização da página: 3 de abril de 2026

Para fazer seu aplicativo funcionar no Ethereum, você pode usar o objeto web3 fornecido pela biblioteca web3.js. Internamente, ele se comunica com um nó local por meio de chamadas RPC. web3 (opens in a new tab) funciona com qualquer nó Ethereum que expõe uma camada RPC.

web3 contém o objeto eth - web3.eth.

Este documento descreve a versão 3 da Definição de Armazenamento Secreto da Web3.

Definição

A codificação e decodificação atuais do arquivo permanece em grande medida inalteradas da versão 1, exceto que o algoritmo cripto já não é fixo no AES-128-CBC (AES-128-CTR agora é o requisito mínimo). A maioria dos significados/algoritmos são semelhantes à versão 1, exceto o mac, que é dado como o SHA3 (keccak-256) das concatenações dos segundos 16 bytes mais à esquerda da chave derivada, juntamente com o ciphertext completo.

Arquivos de chave secreta são armazenados diretamente em ~/.web3/keystore (para sistemas do tipo Unix) e ~/AppData/Web3/keystore (para Windows). Eles podem receber qualquer nome, mas uma boa convenção é <uuid>.json, onde <uuid> é o UUID de 128 bits atribuído à chave secreta (um proxy de preservação de privacidade para o endereço da chave secreta).

Todos esses arquivos possuem uma senha associada. Para derivar a chave secreta de um determinado arquivo .json, primeiro derive a chave de criptografia do arquivo; isso é feito pegando a senha do arquivo e passando-a por uma função de derivação de chave, conforme descrito pela chave kdf. Os parâmetros estáticos e dinâmicos dependentes do KDF para a função KDF são descritos na chave kdfparams.

PBKDF2 deve ser apoiado por todas as implementações minimamente compatíveis, denotadas assim:

  • kdf: pbkdf2

Para PBKDF2, os kdfparams incluem:

  • prf: Deve ser hmac-sha256 (pode ser estendido no futuro);
  • c: número de iterações;
  • salt: salt (sequência de bits aleatórios) passado para o PBKDF;
  • dklen: comprimento da chave derivada. Deve ser >= 32.

Uma vez que a chave do arquivo tenha sido derivada, ela deveria ser verificada através da derivação do MAC. O MAC deve ser calculado como o hash SHA3 (keccak-256) do array de bytes formado pelas concatenações dos segundos 16 bytes mais à esquerda da chave derivada com o conteúdo da chave ciphertext, ou seja:

KECCAK(DK[16..31] ++ <ciphertext>)

(onde ++ é o operador de concatenação)

Este valor deve ser comparado com o conteúdo da chave mac; se forem diferentes, uma senha alternativa deve ser solicitada (ou a operação cancelada).

Após a verificação da chave do arquivo, o texto cifrado (a chave ciphertext no arquivo) pode ser descriptografado usando o algoritmo de criptografia simétrica, especificado pela chave cipher e parametrizado através da chave cipherparams. Se o tamanho da chave derivada e o tamanho da chave do algoritmo forem incompatíveis, os zeros à esquerda, os bytes à direita da chave derivada deverão ser usados como a chave para o algoritmo.

Todas as implementações minimamente compatíveis devem suportar o algoritmo AES-128-CTR, indicado através de:

  • cipher: aes-128-ctr

Esta cifra toma os seguintes parâmetros, dados como chaves para a chave dos parâmetros de decifração:

  • iv: vetor de inicialização de 128 bits para a cifra.

A chave para a cifra são os 16 bytes mais à esquerda da chave derivada, ou seja, DK[0..15]

A criação/criptografia de uma chave secreta deve ser essencialmente o inverso dessas instruções. Certifique-se de que o uuid, o salt e o iv sejam realmente aleatórios.

Além do campo version, que deve atuar como um identificador "rígido" da versão, as implementações também podem usar o minorversion para rastrear alterações menores, que não quebram o formato.

Vetores de Teste

Detalhes:

  • Address: 008aeeda4d805471df9b2a5b0f38a0c3bcba786b
  • ICAP: XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67
  • UUID: 3198bc9c-6672-5ab3-d9954942343ae5b6
  • Password: testpassword
  • Secret: 7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d

PBKDF2-SHA-256

Vetor de teste usando AES-128-CTR e PBKDF2-SHA-256:

Conteúdo do arquivo ~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json:

Intermediários:

Chave derivada: f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551 Corpo do MAC: e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46 MAC: 517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2 Chave de cifra: f06d69cdc7da0faffb1008270bca38f5

Scrypt

Vetor de teste usando AES-128-CTR e Scrypt:

Intermediários:

Chave derivada: 7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d Corpo do MAC: edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2 MAC: 337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c Chave de cifra: 7446f59ecc301d2d79bc3302650d8a5c

Alterações da Versão 1

Esta versão corrige várias inconsistências com a versão 1 publicada aqui (opens in a new tab). Em resumo, estas são:

  • A capitalização é injustificada e inconsistente (scrypt minúsculas, Kdf caso misto, MAC maiúsculas).
  • Endereço desnecessário e compromete a privacidade.
  • Salt é intrinsecamente um parâmetro da função de derivação de chave e merece ser associado a ela, não à criptografia em geral.
  • SaltLen desnecessário (basta derivá-lo do Salt).
  • A função chave de derivação é dada, no entanto, o algoritmo de criptografia é difícil de especificar.
  • Version é intrinsecamente numérico, mas é uma string (o versionamento estruturado seria possível com uma string, mas pode ser considerado fora do escopo para um formato de arquivo de configuração que muda raramente).
  • KDF e cipher são conceitos conceitualmente semelhantes, mas organizados de forma diferente.
  • MAC é calculado através de um trecho de dados agnóstico a espaços em branco(!)

Foram feitas alterações no formato para dar o seguinte arquivo, funcionalmente equivalente ao exemplo dado na página anteriormente vinculada:

Alterações da Versão 2

A versão 2 foi uma implementação inicial de C++ com um número de bugs. Todos os elementos essenciais permanecem inalterados.

Este artigo foi útil?