← Cuadernos Lacre

Conceito · 23 de maio de 2026

As 24 palavras: o que é uma identidade criptográfica

Uma identidade criptográfica não é uma senha: nenhum servidor a guarda e não se recupera. Uma explicação didática do mecanismo BIP39, por que exatamente vinte e quatro palavras, e que peso real recai sobre quem as possui.

A diferença entre uma senha e uma identidade

Uma senha, no modelo clássico da internet, é um comprovante de identidade. O usuário tem uma identidade — um nome, um e-mail, um número de cliente — e, para provar a um servidor que é quem diz ser, apresenta uma senha que o servidor compara com uma impressão armazenada. Se as impressões coincidirem, o servidor concede a sessão. Se a senha for perdida, o usuário continua sendo o mesmo usuário; o que perde é o comprovante, e existe um procedimento de recuperação — um e-mail para o endereço registrado, uma pergunta de segurança — para restaurá-lo.

Uma identidade criptográfica funciona de outra maneira. É, antes de tudo, um segredo matemático completo em si mesmo, não uma credencial que alguém compara com uma impressão armazenada. Não importa onde resida — num papel, num dispositivo, até num servidor alheio —: a identidade existe pela sua matemática, não por quem a valida. Aqui aparece uma propriedade semelhante à que vimos em «O que é realmente SHA-256»: a posse não se demonstra exibindo o segredo, mas usando-o para assinar. A assinatura assim produzida pode ser verificada por qualquer pessoa com um valor público que se deriva matematicamente do próprio segredo, sem necessidade de conhecer o segredo em si, e sem que um terceiro intermedie a verificação. Quem tem o segredo, é a identidade; quem o perde, deixa de sê-la. A sentença é categórica: não há ninguém a quem pedir que lhe devolva a identidade. Não existe esse alguém, porque não a tinha em primeiro lugar.

O que representam vinte e quatro palavras

A identidade criptográfica é habitualmente representada por um segredo matemático de trinta e dois bytes — duzentos e cinquenta e seis bits. Um número difícil de reter e ainda mais difícil de transcrever sem erro. A indústria criptográfica resolveu este problema em 2013 com um padrão pequeno e elegante chamado BIP39: uma forma de representar esses duzentos e cinquenta e seis bits como uma sequência de vinte e quatro palavras retiradas de uma lista oficial de duas mil quarenta e oito. A aritmética por trás encaixa com elegância; quem quiser vê-la em detalhe encontra-a na margem.

A conta não é decorativa. Se alguém transcrever vinte e três palavras corretamente e se equivocar na vigésima quarta, a soma de verificação detetará o erro: o software dirá "esta sequência não é válida". Se alguém transcrever as vinte e quatro corretas, o software derivará a mesma identidade sem ambiguidade. A escolha da lista de palavras também é deliberada: as palavras do vocabulário BIP39 são curtas, distintas entre si, sem diacríticos, escolhidas para minimizar confusões fonéticas e ortográficas. É um vocabulário desenhado para ser lembrado, escrito e ditado por seres humanos sem perda.

Da frase à chave

As vinte e quatro palavras não são a chave criptográfica que assina mensagens. São uma representação recuperável da entropia original que, através de um processo determinístico chamado PBKDF2, se transforma numa semente (seed) de sessenta e quatro bytes. Dessa semente derivam, também de forma determinística, as chaves criptográficas concretas que o usuário utiliza: uma chave privada para assinar e uma chave pública correspondente que é publicada para verificar as assinaturas. O mesmo mecanismo em sistemas diferentes: as criptomoedas usam a curva secp256k1; o protocolo Signal e muitos sistemas modernos usam Ed25519 sobre a curva Curve25519. Para uma curva concreta como Ed25519, os padrões BIP32 e SLIP-0010 pegam nessa semente de sessenta e quatro bytes e derivam, de forma determinística, os trinta e dois bytes que constituem a chave de assinatura efetiva — os mesmos trinta e dois bytes com os quais começa o exemplo de código da próxima seção.

Esta é a forma padrão como toda a indústria apresenta o mecanismo ao usuário —carteiras de criptomoedas, gestores de identidade descentralizada, o Signal na sua parte de identidade persistente, o Solo2 entre eles—: o usuário, na prática, nunca vê a semente nem as chaves derivadas. Vê as vinte e quatro palavras ao criar a sua identidade e, opcionalmente, anota-as num papel. As palavras viajam depois entre os seus dispositivos quando deseja migrar a identidade: insere-as na nova aplicação, a aplicação deriva a mesma semente, as mesmas chaves, a mesma identidade. É um mecanismo portátil, criptograficamente sólido e, dentro dos limites do razoável, memorizável.

Como assinar com a chave (uma pincelada de Zig)

Em Zig, uma vez que se tem a semente de trinta e dois bytes derivada das vinte e quatro palavras, assinar uma mensagem com Ed25519 cabe em poucas linhas:

const std = @import("std");
const Ed25519 = std.crypto.sign.Ed25519;

// 'semilla' son los 32 bytes derivados de las 24 palabras.
const par = Ed25519.KeyPair.create(semilla);

// Firmar un mensaje con la clave privada:
const mensaje = "Este mensaje lo escribí yo.";
const firma = try par.sign(mensaje, null);

// Cualquiera con la clave pública del par puede verificar:
try Ed25519.Signature.verify(firma, mensaje, par.public_key);

A operação de assinar produz sessenta e quatro bytes —chamados assinatura— que só poderiam ter sido gerados a partir da chave privada correspondente. A verificação é pública: qualquer pessoa com a chave pública pode verificar se a assinatura corresponde à mensagem. Sem a chave privada, ninguém pode produzir uma assinatura válida para essa mensagem; com la chave pública, todos podem detetar se uma assinatura é válida. Essa assimetria é o que permite ao signatário demonstrar autoria sem compartilhar o segredo.

O exemplo anterior é a versão mínima de manual. No código real do Solo2, a cadeia atravessa dois ficheiros, um em JavaScript que vive no navegador do utilizador e reconstrói a entropia a partir das vinte e quatro palavras, outro em Zig dentro da biblioteca zcatcrypto que toma essa entropia e deriva as chaves criptográficas concretas. Começando pelo lado do navegador:

// solo2/web-app/js/lib/bip39.js
async function mnemonicToEntropy(mnemonic, lang) {
    const validation = await validateMnemonic(mnemonic, lang);
    if (!validation.valid) {
        return { entropy: null, valid: false, error: validation.error };
    }
    const wordlist = WORDLISTS[lang || 'en'];
    const words = mnemonic.trim().split(/\s+/);

    // Cada palabra aporta 11 bits (su índice en la lista de 2048).
    let bits = '';
    for (let i = 0; i < words.length; i++) {
        bits += wordlist.indexOf(words[i]).toString(2).padStart(11, '0');
    }

    // 24 palabras = 264 bits. Los primeros 256 son la entropía.
    const entropyBytes = new Uint8Array(32);
    for (let j = 0; j < 32; j++) {
        entropyBytes[j] = parseInt(bits.slice(j * 8, (j + 1) * 8), 2);
    }
    return { entropy: entropyBytes, valid: true };
}

Esses trinta e dois bytes de entropia, juntamente com outros trinta e dois derivados no mesmo passo, viajam para o módulo WebAssembly do Zig que gera as chaves Ed25519 propriamente ditas. A função completa, com a sua limpeza de memória final, cabe num ecrã:

// zcatcrypto/wasm/bindings/identity.zig
const Ed25519 = std.crypto.sign.Ed25519;
const X25519  = std.crypto.dh.X25519;

export fn identity_generate() ?*IdentityHandle {
    var seed: [64]u8 = undefined;
    if (!common.getRandomBytes(&seed)) return null;

    const handle = common.wasm_allocator.create(IdentityHandle) catch return null;

    // Bytes 0..31: semilla determinista del par Ed25519 (firma).
    const sign_kp = Ed25519.KeyPair.generateDeterministic(seed[0..32].*) catch {
        common.wasm_allocator.destroy(handle);
        return null;
    };
    handle.sign_secret = sign_kp.secret_key.toBytes();
    handle.sign_public = sign_kp.public_key.toBytes();

    // Bytes 32..63: secreto X25519 (para acordar claves de cifrado con el otro).
    handle.exchange_secret = seed[32..64].*;
    handle.exchange_public = X25519.recoverPublicKey(handle.exchange_secret) catch {
        common.wasm_allocator.destroy(handle);
        return null;
    };

    @memset(&seed, 0);  // Borra la semilla de la memoria.
    return handle;
}

Vale a pena assinalar dois detalhes. O primeiro: uma mesma semente produz sempre o mesmo par de chaves — é exatamente isso que permite recuperar a identidade introduzindo as vinte e quatro palavras num novo dispositivo. O segundo: a semente é apagada explicitamente da memória na última linha. Passado esse ponto, nem a própria função poderia reconstruir as chaves; as palavras do utilizador seriam a única origem.

Convém aqui uma breve paragem, porque a cadeia inteira pode ser confundida, num olhar rápido, com outra primitiva do trio: o hash. Não o é. Um hash é uma função única que comprime — entram muitos bytes, sai uma pegada curta, aí acaba o caminho. Uma identidade criptográfica é um par matemático complementar: o segredo fica e assina; a sua contraparte pública é publicada e verifica. Onde o hash colapsa informação num sentido único, a identidade estabelece uma assimetria entre duas metades. O hash atesta o que foi dito; a identidade atesta quem o disse.

O que a frase não é

Convém esclarecer três equívocos frequentes. A frase não é uma senha no sentido próprio: não é comparada com uma impressão digital armazenada num servidor; é inserida no dispositivo do usuário para reconstruir matematicamente a identidade. A frase não se recupera: se for perdida, não há ninguém a quem a pedir; se for duplicada, a identidade também é duplicada. A frase não é uma credencial separável da identidade: a frase é a identidade. Quem a possui pode agir como tal, sem permissão adicional, sem processo de autorização, sem recuperação possível.

Esta terceira propriedade é a que muda o peso do assunto. Uma senha perdida é um transtorno administrativo. Uma identidade criptográfica perdida é a identidade. Um papel com a frase encontrado por terceiros não é um risco de roubo de conta: é a entrega da identidade inteira. A promessa do sistema — de que ninguém lhe pode revogar a sua identidade nem bloqueá-lo arbitrariamente — vem acompanhada, inseparavelmente, da responsabilidade de ser o único guardião de algo que ninguém pode restituir por si.

A promessa e o peso

O modelo de identidade criptográfica costuma receber o qualificativo de autossoberana —self-sovereign na literatura anglo-saxónica—. A escolha da palavra é deliberada e descreve a condição com bastante exatidão. O usuário é soberano sobre a sua identidade num sentido quase medieval: não é concedida por nenhum rei, nenhum emissor, nenhuma autoridade central; tampouco pode ser retirada por nenhum dos anteriores. Mas também, como o monarca medieval, o usuário carrega com a consequência inteira dos seus erros: não há regente que tome decisões no seu lugar se perder o selo.

A escolha entre uma identidade gerida por um terceiro e uma identidade autossoberana não tem uma resposta universal correta. Para a conta de um fórum irrelevante, a identidade gerida é provavelmente proporcional ao risco. Para uma identidade profissional que assina documentos juridicamente vinculativos, para uma identidade económica que guarda as próprias poupanças, para uma identidade de comunicação profissional com clientes que confiaram informações sensíveis, a questão muda. Aí a pergunta deixa de ser «é cómodo?» e torna-se «quem, além de mim, tem o poder de agir como eu, e em que circunstâncias?».

Onde aparece este mecanismo em sistemas reais

O BIP39 nasceu no mundo do Bitcoin em 2013 e espalhou-se rapidamente para todo o ecossistema das criptomoedas: qualquer carteira séria aceita hoje uma frase BIP39 de doze ou vinte e quatro palavras como backup da identidade económica do seu detentor. Fora das criptomoedas, o mesmo conceito subjacente — par criptográfico que prova a autoria sem intermediário — aparece noutros sistemas com sintaxe diferente. As chaves SSH que um administrador de sistemas usa para aceder aos seus servidores são um caso clássico: uma chave privada que o administrador guarda na sua máquina e uma pública que é copiada para cada servidor; ninguém comparável a um serviço centralizado intervém. O protocolo Signal usa Ed25519 com material de chave persistente no dispositivo; as eIDAS europeias, na sua parte de assinatura qualificada, descansam sobre o mesmo princípio criptográfico, com a diferença de que a chave é custodiada por um prestador de serviços de confiança qualificado em vez do utilizador.

Solo2, plataforma editora desta publicação, usa uma frase BIP39 de vinte e quatro palavras como identidade de cada utilizador. O utilizador, ao criar a sua conta, vê as palavras uma vez. Não são armazenadas em nenhum servidor da Solo2 nem de ninguém: se o utilizador as anota e as custodia, mantém a sua identidade para sempre. Se as perder, perdeu-as. É a consequência coerente com a arquitetura de não haver operador no meio: se a Solo2 pudesse devolver a identidade ao utilizador que a perdeu, poderia também dá-la a quem pressionar a Solo2 para que lha dê.

O selo sem chancelaria

Um monarca medieval governava através do seu selo, mas não governava apenas com ele: por trás havia uma chancelaria, escribas que mantinham registos, uma corte capaz de reconhecer uma falsificação e de reconstruir, com testemunhas e memória institucional, o que um selo perdido ou roubado deixava em dúvida. Quem hoje guarda vinte e quatro palavras tem o selo e nada mais: nenhuma chancelaria, nenhum escriba, nenhuma memória institucional que possa dirimir uma disputa ou repor o que foi perdido. O papel dobrado numa gaveta, a placa de metal gravada, o envelope selado em depósito notarial não são senão a tentativa, artesanal e necessariamente incompleta, de fabricar uma chancelaria própria com as ferramentas de um particular.

Um rei sem chancelaria governa exatamente igual a um que a tenha —até ao dia em que perde o selo, e nesse dia deixa de governar sem que reste ninguém a quem apelar.


Este artigo fecha o trio conceptual que abriu o ciclo — hash, cifragem, identidade —. As três ideias constroem-se umas sobre as outras: o hash dá a pegada inalterável, a cifragem dá a confidencialidade sem terceiro de confiança, a identidade dá a autoria sem terceiro de concessão. As tres partilham uma propriedade que também não é ideológica: trasladam, de quem gere um serviço para quem o usa, capacidades técnicas que tradicionalmente residiam no operador. Trasladam com elas também responsabilidades. Falar com honestidade de qualquer uma das três exige falar também das outras duas.

Fontes e leitura adicional

  • Palatinus, M.; Rusnak, P.; Voisine, A.; Bowe, S. — BIP-0039: Mnemonic code for generating deterministic keys, proposta de melhoria do Bitcoin de 2013. Padrão de facto para frases de recuperação na indústria criptográfica.
  • RFC 8032 — Edwards-Curve Digital Signature Algorithm (EdDSA), incluindo Ed25519. IETF, janeiro de 2017. Especificação normativa do esquema de assinatura usado em boa parte da indústria contemporânea.
  • RFC 2898 — PKCS #5: Password-Based Cryptography Specification, versão 2.0. IETF, setembro de 2000. Define o algoritmo PBKDF2 usado na derivação BIP39 de frase a semente (seed).
  • Regulamento (UE) 910/2014 (eIDAS) e a sua evolução pelo Regulamento (UE) 2024/1183 (eIDAS 2) — quadro europeu de identidade eletrónica e assinatura qualificada. Regime distinto do autossoberano, mas conceptualmente apoiado nos mesmos primitivos criptográficos.
  • Allen, C. — The Path to Self-Sovereign Identity (2016). Texto canónico sobre os princípios e compromissos do modelo autossoberano, anterior mas relevante para a compreensão da família de soluções contemporâneas.

Leituras recentes