Buscando um tema para um novo tutorial para postar por essas bandas, identifiquei que temos pouquíssimo material que contemple a assinatura de mensagens (parte integrante, inclusive, do
procedimento para restauração de contas aqui no BTT. O único tutorial que temos e que já está listado em nosso
Guia de Postagens é o do @textgeek (
Como assinar uma transação BTC usando Carteira Electrum) mas que, como o título indica, é dedicado ao processo apenas com a Electrum.
Pensei em fazer algo mais abrangente e, durante as pesquisas, acabei encontrando
este tópico do usuário @shorena que se mostrou bem completo! No entanto, com sua última atualização tendo ocorrido já há algum tempo (Set/18), achei que seria uma oportunidade de montar algo na mesma linha, porém, mais atualizado, detalhado e buscando uma melhor diagramação dos passos e das imagens - penso que a visualização completa de todas as aplicações no corpo do próprio tópico acaba por dificultar a leitura do todo, então a idéia é detalhar cada um dos passos e, caso exista alguma dificuldade, imagens em proporção real (clique nelas para visualizá-las sob esta condição) podem ser referenciadas ao final de cada um dos procedimentos.
Seguirei esporadicamente atualizando o tópico e até incluindo outras carteiras/serviços. Afinal, os aqui listados elencam apenas algumas das opções que temos no mercado.
BITCOIN
COMO ASSINAR UMA MENSAGEM
Í N D I C E1. Introdução2. Como Funciona?3. Indicações4. Assinando uma mensagem5. Apresentação6. Verificando uma assinatura7. Serviços/carteiras que não dispõem da funcionalidade de assinatura ou não foram testados
1. INTRODUÇÃO? Estamos acostumados a passar referências bancárias quando necessário. Nesta ocasiões, normalmente informações como o nome/código do banco, agência, conta, etc. são suficientes para estabelecer uma ligação da pessoa física com a mesma. Mas... como fazer isso quando estamos falando do Bitcoin e sua economia descentralizada? Em um ambiente onde não há um link direto entre o mundo real e o digital, como garantir a alguma parte que um determinado endereço realmente lhe pertence?
Para estas situações, a função de
assinatura pode ser utilizada. A idéia aqui é que, em posse da chave privada de um determinado endereço, você consiga customizar uma mensagem em particular que poderá ser utilizada para aquele um fim em especial ou mesmo para generalizadamente exprimir a posse da daquele endereço e, consequentemente, dos fundos ali contidos.
Seguindo a analogia inicial, poderíamos dizer que seria algo como um cheque de seu banco, onde apenas com o vínculo de sua assinatura, o mesmo seria validado - identificando-o como o real titular e liberando o montante ali indicado. A diferença no Bitcoin é que não há margem para erros, estamos falando de uma
verificação matemática, assim como ocorre em todas as operações da moeda.
Dentre algumas utilidades do processo, podemos citar alguns possíveis exemplos de objetivos com a ação, como:
2. COMO FUNCIONA? Como sabemos, o Bitcoin utiliza o Algoritmo de Assinatura Digital de Curva Elíptica, mais conhecido como
ECDSA para assinar as transações. Mas como isso funciona exatamente? Diversos cálculos são realizados sobre os valores de entrada, sofrem uma compressão, gerando um hash que é justamente o ponto a ser validado. As etapas resumem-se da seguinte forma:
1) Gera-se a chave
2) Codifica-se
3) Gera-se o hash
4) Compara-se o hash obtido com o extraído através do endereço originalPara um melhor entendimento sobre a criptografia de curva elíptica, referencie o
documento oficial do SEC (não, não estamos falando aqui da
Securities and Exchange Comission dos EUA
).
3. INDICAÇÕES Como estamos falando de um "método de validação", é sumariamente importante que ela seja realizada da melhor maneira, sem que existam lacunas para indivíduos de má índole tirarem proveito das informações. Sendo a idéia da assinatura uma forma comprobatória de posse de um endereço, dados não tão específicos podem dar margem à interpretações incorretas e apoderamento por terceiros do propósito original.
Partindo dessa premissa, existem alguns apontamentos que devem ser seguidos e alguns outros que devem ser
evitados de toda forma:
- NUNCA baixe uma carteira sem verificar o hash do arquivo e confrontá-lo com a informação oficial do desenvolvedor. Para checá-lo no Windows, você pode utilizar o WinMD5Free, seguindo as simples etapas:
1) Baixe o arquivo desejado e abra-o no WindMD5Free clicando em "Browse..":
| 2) Uma vez aberto, o campo "Current file MD5 checksum value" será preenchido com o valor MD5 do arquivo. Copie o MD5 fornecido pelo site do desenvolvedor e o insira no último campo ("Original file MD5 checksum value") e clique em Verify:
| 3) Se o valor estiver de acordo, uma janela pop-up será exibida confirmando a informação, o inverso ocorrerá se os valores não forem os mesmos (obs.: o próprio arquivo do WinMD5Free foi utilizado no exemplo):
|
- NUNCA assine uma mensagem sem que a data e o propósito sejam minuciosamente expressos. Quanto mais informações, mais difícil fica para o agente externo deturparem/desviarem seu objetivo original
- NUNCA utilize uma máquina pública e/ou que não possua proteção suficiente para que você execute a operação. Lembre-se que você está lidando com a chave de acesso de sua carteira e, assim como em processos de transferência de moedas, todo cuidado é pouco! Atente-se à presença de keyloggers, malwares e qualquer componente malicioso que possa vir a se apossar das informações ali utilizadas. Isso é válido para todos os ambientes, seja ele desktop ou mobile.
- NUNCA forneça a sua chave privada para um terceiro que você não confie plenamente - e, talvez, nem ele(a), afinal quanto mais vias de comunicação com a informação, mais pontos de falha!
- NUNCA forneça seus dados para algum serviço que informa gerar assinaturas. O processo é extremamente simples e depende única e exclusivamente do portador da chave: você!
- NUNCA assine mensagens com carteiras/serviços que você não conhece. Se você não tem conhecimento da idoneidade da ferramenta que utilizará, pesquise/se informe antes de utilizá-la com as suas chaves. Se desejar, pode postar aqui no tópico que certamente o pessoal te dará uma mão, seja por experiência ou ajudando a garimpar informações a respeito.
Obs.: Indico a utilização de um live CD/USB e, se possível, de forma offline nos serviços e carteiras que permitam a operação neste estado.
4. ASSINANDO UMA MENSAGEM Como vocês deverão notar, o procedimento é extremamente parecido na maior parte das carteiras/serviços, usualmente os campos são tratados da mesma forma e, inclusive, pelo mesmo nome. Em algumas situações o módulo fica um pouco mais escondido, mas se ele existe, a gente encontra
Para os exemplos, usualmente utilizaremosum endereço vanity (
criada especialmente para este tutorial, utilizando o VanitySearch - quer saber como criar o seu próprio? Confira o tutorial dedicado para este fim. É extremamente fácil!) e a mesma mensagem:
Endereço:1BRAS1LEnc9tduTm6QT8awP3F5gpHX5KZe
Mensagem: Este é um teste feito por cryptobaboon em uma carteira teste para a comunidade luso-brasileira do Bitcointalk em 16/02/2020.
This is a test done by cryptobaboon in a test wallet for the portuguese/brazilian community from Bitcointalk on Feb 16, 2020.
A segmentação segue cada uma das carteiras com suas respectivas versões. Lembrando apenas que se a sua versão não é a abaixo descrita, dê uma conferida mesmo assim! Muitas vezes as atualizações são apenas de caráter técnico e não refletem no ambiente gráfico da aplicação, ou seja, a disposição das opções/campos podem ser exatamente iguais ou ao menos extremamente similares.
IMPORTANTE: Se o endereço a ser assinado é um endereço Segwit (iniciado por 3 ou bc1q), por não haver um padrão responsável por este confrontamento, uma conversão para legacy é necessária. Nosso amigo @Loganota postou abaixo dando maiores detalhes de como executar o procedimento e, desta forma, ter um workaround para este tipo de endereçamento.Devido a quantidade um pouco elevada de itens, indico a utilização do
índice caso você esteja procurando por alguma ferramenta em particular.
- Armory v0.96.5 (LINK)
1) Clique em Tools > Message Signing/Verification...;
2) Na janela que surgir, selecione o endereço desejado (Sign with Address), a mensagem (Message to sign) e clique em uma dos tipos de formato disponíveis;
3) Na janela pop-up que surgir, entre com a senha da carteira;
4) A assinatura será exibida no campo Message Signature.
- Bitcoin Core v0.19.0.1 (LINK)
1) Clique em File > Sign Message...
2) Entre com o endereço a ser assinado (Address), a mensagem (Message), clique no botão Sign message e entre com a senha na janela que surgir.
3) A assinatura será exibida no campo Signature.
- Bitcoin Knots v0.19.0.1knots20200104 (LINK)
1) Clique em File > Sign Message...
2) Entre com o endereço a ser assinado (Address), a mensagem (Message). clique no botão Sign message e entre com a senha na janela que surgir.
3) A assinatura será exibida no campo Signature.
- Bither v1.4.7 (LINK)
1) Clique em More... > Sign Message;
2) Na janela que surgir, clique no endereço desejado;
3) Preencha os campos adequadamente, com a mensagem (Original message) e a senha da carteira (Password) e clique em Sign;
4) A assinatura será exibida no campo Signature.
- Bither v1.8.8 (LINK)
1) Clique na engrenagem no canto superior direito;
2) Clique em "Advanced options > Message Signing";
3) Clique em "Sign Message";
4) Selecione o endereço a ser assinado;
5) Preencha com a mensagem (Message) e clique em Sign;
6) Entre com a senha da carteira e clique em OK;
[b7)[/b] A assinatura será exibida em um novo campo logo abaixo da mensagem.
- Blockchain.com v1.0.6.0 (LINK)
1) Clique em Settings > Wallet & Addresses;
2) Clique na opção More Options > Sign Message;
3) Na janela pop-up que surgir, entre com a mensagem desejada (Message) e clique em Sign;
4) A assinatura será exibida no campo Signature.
- BrainWalletX dt.23.02.20 (LINK)
1) Clique em Sign no menu superior;
2) Na janela que surgir, preencha os campos adequadamente, com o chave privada (Private Key), a mensagem (Message), o tipo de assinatura (Signature Type) e clique em Sign;
4) A assinatura será gerada e populará o campo Signed Message. DICA: Compartilhe o link contido no botão Permalink para uma direção direta para a validação da assinatura em questão no ambiente da BrainWalletX, sem que nenhum download seja necessário por parte do agente verificador.
- Coinomi v1.18.7 (LINK)
1) Clique em "Bitcoin";
2) Clique nos três pontos no canto superior direito superior direito;
3) Clique na opção "Assinar/verificar mensagem (Sign/Verify Message)";
4) Na tela seguinte preencha o endereço (Endereço para assinar (Address to sign)), a mensagem (Mensagem (Message)) e clique em Assinar(Sign));
5) Na janela pop-up entre com a senha da carteira e clique em "OK";
6) A assinatura será exibida no campo Assinatura.
- Coinomi v1.8.5 (LINK)
1) Clique em "Bitcoin";
2) Clique nos três pontos no canto superior direito superior direito;
3) Clique na opção "Assinar/verificar mensagem (Sign/Verify Message)";
4) Na tela seguinte preencha o endereço (Endereço para assinar (Address to sign)), a mensagem (Mensagem (Message)) e clique em Assinar(Sign));
5) Na janela pop-up entre com a senha da carteira e clique em "OK";
6) A assinatura será exibida no campo Assinatura.
- Electrum v3.3.8 (LINK)
1) Clique em Tools > Sign/Verify message...
2) Entre com a mensagem (Message), o endereço (Address) e clique em Sign
3) Na janela pop-up que surgir, entre com a senha da carteira no único campo disponível e clique em OK
4) A assinatura será exibida no campo Signature.
- Magnum Wallet dt.21.02.20 (LINK)
1) Clique em BTC no menu principal no canto superior esquerdo;
2) Clique nos três pontos logo abaixo da opção de logout no canto superior direito e escolha a opção (Sign Message);
3) Na janela que surgir, entre com a mensagem (Message), a senha da carteira (Password) e clique em Sign Message;
4) Um novo campo surgirá (Signature) contendo a assinatura.
- Magnum Wallet v1.0.12 (LINK)
1) Clique em "Bitcoin";
2) Clique nos três pontos no canto superior direito;
3) No menu que surgir, clique na opção "Sign Message";
4) Entre com a mensagem (Message), a senha da carteira (Password) e clique em Sign Message.
5) Um novo campo surgirá (Signature) contendo a assinatura.
- Mycelium Wallet v3.3.1.1 (LINK)
1) Clique em "Conta (Account)";
2) Selecione a conta desejada e, em seguida, clique no ícone de contexto no canto superior direito;
3) Nas opções que surgirem, clique em "Assinar mensagem (Sign Message)";
4) Na tela seguinte escolha qual endereço terá a mensagem assinada;
5) Na tela seguinte preencha o único campo disponível com a mensagem e clique em Assinar Mensagem (Sign Message);
6) A assinatura será exibida na parte inferior da tela. Você pode clicar em um dos botões para copiá-la de acordo com o desejado.
- Samourai Wallet v.0.99.88 (LINK)
1) Clique em "Show unspent outputs";
2) Selecione o endereço a ser verificado e em "Sign message";
3) Entre com a mensagem no campo Message e clique em "Yes" quando concluir;
4) A assinatura será exibida no campo Entre com a mensagem Signature.
5. APRESENTAÇÃO Mas como expressar essa assinatura? Basta informá-la sem qualquer vínculo com o endereço? Existe algum padrão para o fornecimento deste tipo de informação? Sim! Existe uma "estrutura padrão" utilizada para a transmissão destas validações e usada até mesmo em algumas ferramentas. Usualmente, aqui no fórum o seguinte modelo é utilizado:
-----BEGIN BITCOIN SIGNED MESSAGE-----
-----BEGIN SIGNATURE-----
-----END BITCOIN SIGNED MESSAGE-----
Alterando-se, logicamente, as 3 informações indicadas (mensagem / endereço / assinatura). Usando o exemplo utilizado anteriormente, teríamos:
-----BEGIN BITCOIN SIGNED MESSAGE-----
Este é um teste feito por cryptobaboon em uma carteira teste para a comunidade luso-brasileira do Bitcointalk em 16/02/2020.
This is a test done by cryptobaboon in a test wallet for the portuguese/brazilian community from Bitcointalk on Feb 16, 2020.
-----BEGIN SIGNATURE-----
1BRAS1LEnc9tduTm6QT8awP3F5gpHX5KZe
H/NiN1wzJhrBuHoPV8D8xJNADPZQFAWdns67AS4ttlkXdIsFdHoksQIGZCWt1yjDZK69oeIWfYtYwLRyHgRGdqo=
-----END BITCOIN SIGNED MESSAGE-----
IMPORTANTE: Utilize as tags CODE ao invés de QUOTE, isso garante que todas as informações (principalmente referente a mensagem, que usualmente envolve espaço) sejam contabilizadas para a correta verificação da assinatura gerada.
6. VERIFICANDO UMA ASSINATURA Se há um cálculo para gerar uma assinatura com base em algumas informações, logicamente para fazer a prova real um cálculo inverso também pode ser operado. Felizmente, assim como na ação original, temos ferramentas que possuem módulos de validação destas informações. Esta seção contará com os que consegui testar até o momento, os elecando da mesma forma (nome do app/serviço + versão).
Seguindo o teste realizado na criação (naqueles onde a importação do endereço foi possível), a assinatura gerada para a mesma composição foi esta:
H/NiN1wzJhrBuHoPV8D8xJNADPZQFAWdns67AS4ttlkXdIsFdHoksQIGZCWt1yjDZK69oeIWfYtYwLRyHgRGdqo=
Que será utilizada como parâmetro para a devida validação nos procedimentos abaixo.
- Armory v0.96.5 (LINK)
1) Clique em Tools > Message Signing/Verification...;
2) Na janela que surgir, clique na aba Verify Bare Signature
3) Preencha os campos com os respectivos dados: endereço (Signing Address), mensagem (Signed message), assinatura (Signature) e clique em Verify Signature;
4) Sendo a assinatura válida, uma mensagem indicando o sucesso (The supplied signature is valid) será exibida.
1> | | 2> | |
- Bitcoin Core v0.19.0.1 (LINK)
1) Clique em File > Verify Message...
2) Entre com o endereço a ser assinado (Address), a mensagem (Message) e clique no botão Verify Message.
3) Sendo a assinatura válida, uma mensagem indicando o sucesso (Message verified.) será exibida.
- Bitcoin Knots v0.19.0.1knots20200104 (LINK)
1) Clique em File > Verify Message...
2) Entre com o endereço a ser assinado (Address), a mensagem (Message) e clique no botão Verify Message.
3) Sendo a assinatura válida, uma mensagem indicando o sucesso (Message verified.) será exibida.
- Bither v1.4.7 (LINK)
1) Clique em More... > Verify Message Signature;
2) Na janela que surgir, clique no endereço desejado;
3) Preencha os campos adequadamente, com o endereço (Address), a mensagem (Original Message), a assinatura (Signature) e clique em Verify;
4) Sendo a assinatura válida, uma mensagem indicando o sucesso (Signature is correct) será exibida.
- Bither v1.8.8 (LINK)
1) Clique na engrenagem no canto superior direito;
2) Clique em "Advanced options > Message Signing";
3) Clique em "Verify Message";
5) Preencha (Address), a mensagem (Message), a assinatura (Signature) e clique em Verify;
6) A confirmação da validade da assinatura será exibida em uma barra de mensagem na parte superior e um marcador verde ao lado do botão Verify.
- BrainWalletX dt.23.02.20 (LINK)
1) Clique em Verify no menu superior;
2) Selecione a opção Bitcoin QT e Verify From;
3) Na janela que surgir, preencha os campos adequadamente, com o endereço (Address), a mensagem (Message), assinatura (Signature) e clique fora dos campos para que a validação ocorra;
4) Havendo a validação, uma mensagem será exibida na parte superior da página (Message verified to be from ) seguido pelo permalink para a validação sem que as informações precisem ser entradas novamente).
- Coinomi v1.18.7 (LINK)
1) Clique em "Bitcoin";
2) Clique nos três pontos no canto superior direito superior direito;
3) Clique na opção "Assinar/verificar mensagem (Sign/Verify Message)";
4) Na tela seguinte preencha o endereço (Endereço para assinar (Address to sign)), a mensagem (Mensagem (Message)), a assinatura (Assinatura (Signature)) e clique em Verificar (Verify);
5) Uma mensagem será exibida informando a validade da assinatura ("Mensagem verificada");