Glossário / Carteiras e custódia
BIP39
Outros nomes: BIP-39, Código mnemônico.
- O que é o BIP39?
- O BIP39 é a especificação de 2013 que codifica a entropia da carteira como palavras de uma lista fixa de 2.048 palavras e as estende até formar uma seed de 512 bits.
Especificação no BIP-39.
Quase toda carteira que você pode comprar o implementa, e é por isso que uma frase anotada em um aparelho de uma marca é restaurada em outro. O documento foi apresentado em 10 de setembro de 2013, e o Bitcoin Core nunca o implementou. Sua autoridade sobre seu backup vem da adoção da indústria, não do processo de padronização.
Como funciona
Marek Palatinus e Pavol Rusnak, da SatoshiLabs, com Aaron Voisine e Sean Bowe, escreveram o BIP-39. A especificação define duas conversões e nada mais.
A primeira transforma aleatoriedade em palavras. Uma carteira usa entropia de 128, 160, 192, 224 ou 256 bits, calcula o hash com SHA-256 e acrescenta, como soma de verificação, os primeiros bits desse hash, em quantidade igual à entropia dividida por 32. O total é então lido 11 bits por vez, e cada trecho seleciona uma palavra de uma lista de exatamente 2.048. Os cinco tamanhos de entropia geram 12, 15, 18, 21 e 24 palavras respectivamente, e as duas que você realmente vai encontrar são os extremos dessa faixa.
A soma de verificação é pequena de propósito. Uma frase de 12 palavras carrega quatro bits de verificação, então uma lista montada ao acaso com doze palavras válidas passa na validação aproximadamente uma vez em cada dezesseis. Isso basta para detectar quase todos os erros de cópia à mão e não chega nem perto de tornar segura uma frase inventada.
A segunda conversão transforma palavras em uma seed. A frase é normalizada para Unicode NFKD e depois passa pelo PBKDF2 com HMAC-SHA512 ao longo de 2.048 iterações, com o salt formado pela string literal "mnemonic" seguida de uma frase secreta opcional do usuário. A saída tem sempre 512 bits, seja a frase de 12 palavras ou de 24.
As listas de palavras fazem parte do padrão, não são enfeite. A lista em inglês é construída de modo que duas palavras não compartilhem as quatro primeiras letras e os pares visualmente confundíveis sejam excluídos. Também existem listas oficiais para japonês, coreano, espanhol, chinês nos dois sistemas de escrita, francês, italiano, tcheco e português. Uma frase só faz sentido diante da lista de onde foi tirada, e é por isso que uma frase em espanhol digitada em uma carteira que só aceita inglês falha de imediato.
Onde você o vê
Toda tela de configuração de carteira de hardware, toda caixa de diálogo “restaurar com 12 ou 24 palavras” e todo fluxo de recuperação no software comum é BIP-39 por baixo. A compatibilidade que isso gera é real e vale a pena proteger: é a razão pela qual um aparelho que falha é um transtorno e não uma perda.
O ponto fraco do padrão é o que ele deixa de fora. Uma frase não diz nada sobre qual caminho de derivação, qual tipo de script ou qual software de carteira a produziu, e não carrega nenhum campo de versão para acrescentar um depois. Duas carteiras podem ler as mesmas palavras corretamente e ainda assim mostrar endereços diferentes e saldos diferentes. Anotar o caminho junto com as palavras é a solução alternativa habitual, e é inteiramente uma convenção, não algo com que a especificação ajude.
As 2.048 iterações do PBKDF2 são a outra crítica. Essa contagem era barata em 2013 e hoje é trivial, de modo que o alongamento quase não oferece proteção a quem escolhe uma frase secreta opcional fraca. Não protege nada das próprias palavras, que dependem de seus 128 ou 256 bits de entropia gerada pela máquina.
BIP39 vs carteira HD
O BIP-39 transforma palavras em uma seed; o BIP-32 transforma uma seed em uma árvore de chaves. São documentos separados, de autores diferentes, e uma carteira pode implementar um sem o outro. O Bitcoin Core é totalmente determinístico hierárquico e não tem nenhum suporte a mnemônico. O Electrum é igualmente determinístico hierárquico e usa seu próprio formato de frase com um marcador de versão embutido. Trate “compatível com BIP-39” como uma promessa sobre a leitura das suas palavras, não como uma promessa sobre quais endereços aparecem depois.