• Nenhum resultado encontrado

Endereços Vanity

No documento Dominando Bitcoin (páginas 109-115)

Endereços vanity são endereços bitcoin válidos que contém mensagens possíveis de serem lidas por pessoas. Por exemplo, 1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33 é um endereço válido que contém as letras formando a palavra "Love" como as primeiras letras de Base-58. Os endereços vanity exigem a criação e testagem de bilhões de chaves privadas candidatas, até que uma derive um endereço bitcoin o padrão desejado. Embora existem algumas otimizações no algoritmo de geração vanity, o processo essencialmente envolve selecionar uma chave privada aleatoriamente, derivar a chave pública, derivar o endereço bitcoin e verificar se ele corresponde ao padrão vanity desejado, repetindo esse processo bilhões de vezes até que uma correspondência seja encontrada.

Assim que uma correspondência de um endereço vanity com um padrão desejado for encontrada, a chave privada a partir da qual ele foi derivado agora pode ser usada pelo dono para gastar seus bitcoins da mesma maneira que qualquer outro endereço. Os endereços vanity não são mais ou menos seguros do que qualquer outro endereço. Eles dependem da mesma Curva Elíptica de Criptografia (ECC) e Algoritmo de Hash Seguro (SHA), como qualquer outro endereço. Não é mais fácil descobrir a chave privada de um endereço começando com um padrão vanity, em comparação com qualquer outro endereço.

No [ch01_intro_what_is_bitcoin], nós apresentamos a Eugênia, uma diretora de um centro de caridade para crianças nas Filipinas. Vamos dizer que a Eugênia está organizando uma campanha para arrecadar fundos em bitcoin e quer usar um endereço bitcoin vanity para divulgar em sua campanha. A Eugênia irá criar um endereço vanity que comece com "1Kids" para divulgar a campanha do centro de caridade. Vamos ver como esse endereço vanity será criado e o que isso significa para a segurança do centro de caridade da Eugênia.

Gerando endereços vanity

É importante notar que um endereço bitcoin é simplesmente um número representado por símbulos no alfabeto Base58. Uma busca por um padrão como "1Kids" pode ser vista como uma buscar por um endereço na faixa de 1Kids11111111111111111111111111111 até 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz. Existem aproximadamente 5829 (aproximadamente 1,4 * 1051) endereços nessa faixa, todos começando

com "1Kids". A A amplitude de endereços vanity iniciando com "1Kids" mostra a faixa de endereços que tem o prefixo 1Kids.

Table 9. A amplitude de endereços vanity iniciando com "1Kids"

De 1Kids11111111111111111111111111111

1Kids11111111111111111111111111112 1Kids11111111111111111111111111113 ...

Até 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Vamos ver o padrão "1Kids" como um número e ver quão frequentemente nós encontraríamos esse padrão em um endereço bitcoin (ver A frequência de um padrão vanity (1KidsCharity) e a média de tempo-para-descobrir em um PC desktop). Um computador desktop PC médio, sem nenhum hardware especializado, é capaz de buscar cerca de 100.000 chaves por segundo.

Table 10. A frequência de um padrão vanity (1KidsCharity) e a média de tempo-para-descobrir em um PC desktop

Comprimento Padrão Frequência Tempo médio de busca

1 1K 1 em 58 chaves < 1 milisegundo

2 1Ki 1 em 3.364 50 milisegundos

3 1Kid 1 em 195.000 < 2 segundos

4 1Kids 1 em 11 milhões 1 minuto

5 1KidsC 1 em 656 milhões 1 hora

6 1KidsCh 1 em 38 bilhões 2 dias

7 1KidsCha 1 em 2,2 trilhões 3–4 meses

8 1KidsChar 1 em 128 trilhões 13–18 anos

9 1KidsChari 1 em 7 quadrilhões 800 anos

10 1KidsCharit 1 em 400 quadrilhões 46.000 anos

11 1KidsCharity 1 em 23 quintilhões 2,5 milhões de anos Como você pode ver, a Eugênia não irá criar um enderço vanity "1KidsCharity" tão cedo, mesmo que

ela tivesse acesso a milhares de computadores. Cada caractere adicional aumenta a dificuldade em um fator de 58. Os padrões com mais de sete caracteres são geralmente encontrados utilizando-se hardware especializado, como desktops montados de maneira customizada com múltiplas placas de vídeo (GPUs). Esses hardwares geralmente são equipamentos antigos que eram usados para a mineração do bitcoin, mas se tornaram obsoletos, e agora são usados para buscar endereços vanity. As buscas por endereços vanity em hardwares usando múltiplas placas de vídeo são muito mais rápidas do que as realizadas em um computador desktop comum.

Outra maneira de encontrar um endereço vanity é pagando para um pool de mineradores vanity, como por exemplo o Vanity Pool. Um pool é um serviço que permite que aqueles que tenham hardware com placas de vídeo (GPU) possam ganhar bitcoin por buscarem endereços vanity para outros usuários. Por uma pequena quantia (0,01 bitcoin, ou aproximadamente 5 dólares, na época que esse livro foi escrito), a Eugênia pode pagar para alguém fazer a busca de um endereço vanity com sete caracteres em poucas horas, ao invés de ter que usar seu próprio computador durante meses.

A geração de um endereço vanity é um exercício de força-bruta: são criadas chaves aleatórias, e verifica-se cada uma se corresponde ao padrão desejado. As chaves são criadas repetidamente até que se consiga atingir o padrão desejado. Minerador de endereço vanity mostra um exemplo de um "minerador vanity", um programa projetado para buscar endereços vanity, escrito em C++. O exemplo usa a livraria libbitcoin, que nós apresentamos em [alt_libraries].

Example 8. Minerador de endereço vanity #include <bitcoin/bitcoin.hpp> // The string we are searching for const std::string search = "1kid";

// Generate a random secret key. A random 32 bytes.

bc::ec_secret random_secret(std::default_random_engine& engine); // Extract the Bitcoin address from an EC secret.

std::string bitcoin_address(const bc::ec_secret& secret); // Case insensitive comparison with the search string. bool match_found(const std::string& address);

int main() {

  // random_device on Linux uses "/dev/urandom"

  // CAUTION: Depending on implementation this RNG may not be secure enough!   // Do not use vanity keys generated by this example in production

  std::random_device random;

  std::default_random_engine engine(random());   // Loop continuously...

  while (true)   {

  // Generate a random secret.

  bc::ec_secret secret = random_secret(engine);   // Get the address.

  std::string address = bitcoin_address(secret);   // Does it match our search string? (1kid)   if (match_found(address))

  {

  // Success!

  std::cout << "Found vanity address! " << address << std::endl;   std::cout << "Secret: " << bc::encode_hex(secret) << std::endl;   return 0;

  }   }

  // Should never reach here!   return 0;

}

bc::ec_secret random_secret(std::default_random_engine& engine) {

  // Create new secret...   bc::ec_secret secret;

  // Iterate through every byte setting a random value...   for (uint8_t& byte: secret)

  byte = engine() % std::numeric_limits<uint8_t>::max();   // Return result.

  return secret; }

std::string bitcoin_address(const bc::ec_secret& secret) {

  // Convert secret to pubkey...

  bc::ec_point pubkey = bc::secret_to_public_key(secret);   // Finally create address.

  bc::payment_address payaddr;

  bc::set_public_key(payaddr, pubkey);   // Return encoded form.

  return payaddr.encoded(); }

bool match_found(const std::string& address) {

  auto addr_it = address.begin();

  // Loop through the search string comparing it to the lower case   // character of the supplied address.

  for (auto it = search.begin(); it != search.end(); ++it, ++addr_it)   if (*it != std::tolower(*addr_it))

  return false;

  return true; }

NOTE

O exemplo acima usa std::random_device. Dependendo da implementação ele pode repletir um gerador de número aleatório criptograficamente seguro fornecido pelo sistema operacional. No caso de um sistema operacional do tipo Unix, como o Linux, ele o obtém a partir de /dev/urandom. O gerador de número aleatório utilizado aqui é usado apenas para fins demonstrativos, não sendo apropriado para gerar chaves de bitcoin com qualidade suficiente para ser usadas em produção, já que ele não é implementado com segurança suficiente.

O código de exemplo deve ser compilado usando um compilador C e vinculado à livraria libbitcoin (que deve ser previamente instalada no sistema). Para executar o exemplo, rode o executável vanity- miner++ sem nenhum parâmetro (ver Compilando e executando o exemplo de minerador vanity) e ele irá tentar encontrar um endereço vanity que se inicie com "1kid".

Example 9. Compilando e executando o exemplo de minerador vanity $ # Compila o código com g++

$ g++ -o vanity-miner vanity-miner.cpp $(pkg-config --cflags --libs libbitcoin) $ # Executa o exemplo

$ ./vanity-miner

Endereço vanity encontrado! 1KiDzkG4MxmovZryZRj8tK81oQRhbZ46YT

Secret: 57cc268a05f83a23ac9d930bc8565bac4e277055f4794cbd1a39e5e71c038f3f $ # Executa-o novamente para um resultado diferente

$ ./vanity-miner

Endereço vanity encontrado! 1Kidxr3wsmMzzouwXibKfwTYs5Pau8TUFn

Secret: 7f65bbbbe6d8caae74a0c6a0d2d7b5c6663d71b60337299a1a2cf34c04b2a623 # Use "time" para ver quanto tempo demora para se encontrar um resultado $ time ./vanity-miner

Endereço vanity encontrado! 1KidPWhKgGRQWD5PP5TAnGfDyfWp5yceXM

Secret: 2a802e7a53d8aa237cd059377b616d2bfcfa4b0140bc85fa008f2d3d4b225349 real 0m8.868s

user 0m8.828s sys 0m0.035s

O código de exemplo irá levar alguns segundos para encontrar uma correspondência ao padrão de três caracteres "kid", como nós podemos ver quando usamos o comando time do Unix para medir o tempo de execução. Mude o padrão search no código-fonte e veja como pode ser mais demorado para se conseguir padrões de quatro ou cinco caracteres!

Segurança do endereço vanity

Os endereços vanity podem ser usados tanto para melhorar quanto para burlar medidas de segurança; eles são literalmente uma faca de dois gumes. Quando usado para melhorar a segurança, um endereço diferenciado torna mais difícil para que hackers substituam o seu próprio endereço, fazendo com que seus consumidores a pagarem para eles, ao invés de para você. Infelizmente, os endereços vanity também tornam possível que qualquer um cria um endereço que se pareça com qualquer endereço aleatório, ou mesmo outro endereço vanity, dessa maneira enganando seus consumidores.

A Eugênia poderia divulgar um endereço gerado aleatoriamente (por exemplo, 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy) para que as pessoas enviem suas doações. Ou ela poderia gerar um endereço vanity que começa com 1Kids, para torná-lo mais atraente.

Em ambos os casos, um dos riscos de se usar um endereço fixo único (ao invés de um endereço dinâmico separado para cada doador) é que o ladrão pode ser capaz de se infiltrar em seu site e substituí-lo pelo seu próprio endereço, desviando as doações que você receberia. Se você divulgou seu endereço de doação em vários lugares diferentes, seus usuários podem inspecionar visualmente o endereço antes de fazer um pagamento para se assegurarem que ele é o mesmo que eles viram em seu site, e-mail ou flyer. No caso de um endereço aleatório como 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy, o usuário comum talvez inspecionará apenas os primeiros caracteres "1J7mdg" e estará satisfeito se o endereço corresponder. Usando um gerador de endereços vanity, alguém pode roubá-lo ao rapidamente criar um endereço que se pareça com o verdadeiro, com apenas os primeiros caracteres iguais, como demonstrado em Gerando endereços vanity para corresponder a um endereço aleatório.

Table 11. Gerando endereços vanity para corresponder a um endereço aleatório

Endereço Aleatório Original 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

Vanity (correspondência de 4 caracteres) 1J7md1QqU4LpctBetHS2ZoyLV5d6dShhEy

Vanity (correspondência de 5 caracteres) 1J7mdgYqyNd4ya3UEcq31Q7sqRMXw2XZ6n

Vanity (correspondência de 6 caracteres) 1J7mdg5WxGENmwyJP9xuGhG5KRzu99BBCX Um endereço vanity aumenta a segurança? Se Eugenia gerar o endereço vanity 1Kids33q44erFfpeXrmDSz7zEqG2FesZEN, os usuários provavelmente irão olhar para a palavra com padrão vanity <em>e alguns caracteres além</em>, por exemplo percebendo a parte "1Kids33" do endereço. Isso iria forçar um hacker a gerar um endereço vanity que corresponde a pelo menos seis caracteres (dois a mais), tendo que se esforçar 3.364 vezes mais (58 &#x00D7; 58) do que o que a Eugenia teve que se esforçar para gerar o seu endereço vanity de quatro caracteres. Essencialmente, o esforço que a Eugenia teve que fazer (ou pagar para um pool vanity fazer) acaba exigindo que o hacker produza um padrão vanity mais longo. Se a Eugenia pagar para um pool gerar um endereço vanity de 8 caracteres, o hacker teria que fazer um esforço para produzir um endereço de 10 caracteres, que é inviável de ser feito em um computador pessoal e muito caro para ser obtido, até mesmo em equipamentos de mineração vanity ou em um pool de vanity. O que tem um preço acessível para a Eugenia se torna muito caro para o hacker, especialmente se a recompensa potencial pela fraude não é alta o suficiente para cobrir o custo da geração do endereço vanity.

No documento Dominando Bitcoin (páginas 109-115)