Ferramenta de navegador
Tire as suas chaves secretas do Google Authenticator.
O Google Authenticator mostra um QR code com todas as contas do seu telefone e depois não dá nenhuma forma de lê-lo. Tire uma captura de tela desse código, solte aqui, e você recebe a chave secreta em base32 e o link otpauth de cada uma.
A imagem nunca sai desta aba. A leitura do QR code, a análise e a geração dos códigos acontecem todas no seu navegador, e você pode provar isso desligando a rede e usando a ferramenta mesmo assim.
A ferramenta
Solte uma captura de tela do código de exportação
Ou cole uma, escolha um arquivo, ou aponte a câmera para o telefone.
A decodificação acontece na sua máquina, nesta aba, e é por isso que ela precisa de JavaScript para acontecer. Não existe aqui um servidor que pudesse fazer isso no lugar. Tudo o que vem abaixo explica o formato e o que a ferramenta faz com ele, e o código é publicado, caso você prefira rodar por conta própria.
Antes de começar
Trate esse código de exportação como uma senha.
Não é um aviso de praxe. Um QR code de exportação é um objeto mais perigoso do que a maioria das pessoas imagina, de três maneiras específicas que vale conhecer antes de gerar um.
Ele guarda todas as chaves, não uma foto dos seus códigos
O código contém a chave secreta bruta de cada conta que está nele. Quem tiver a imagem pode gerar códigos válidos para essas contas indefinidamente, de qualquer aparelho, sem o seu telefone e sem que você perceba.
Trocar a senha não revoga esse código
Uma senha nova, um telefone novo, apagar o app: nada disso invalida uma chave secreta exportada. A única coisa que invalida é desligar e ligar de novo a autenticação em duas etapas em cada serviço, o que emite uma chave nova e aposenta a antiga.
A captura de tela sobrevive ao momento
Uma captura de tela cai no seu rolo da câmera e de lá em qualquer backup de fotos que você tenha. Quem a encontrar dentro de um ano terá exatamente o acesso que você tinha. Faça isso em um aparelho em que você confia e apague a imagem depois, inclusive do álbum «Apagados recentemente».
O que volta
Cada campo, e de onde cada um veio.
O motivo para fazer isso direito é que você consegue distinguir dados decodificados de um padrão sensato. Os dois são exibidos, e são rotulados de forma diferente.
A chave secreta
É base32 do RFC 4648, em maiúsculas e sem preenchimento, exatamente como um app autenticador a exibe. Dezesseis caracteres para uma chave de dez bytes, trinta e dois para uma de vinte. Isso é a credencial inteira. Todo o resto são metadados sobre ela.
Emissor e conta
O serviço e a conta a que a chave pertence. O Google às vezes coloca o emissor em um campo próprio e às vezes o embute no rótulo da conta, como «emissor:conta», então os dois são lidos e os dois são exibidos, separadamente.
Algoritmo, dígitos e tipo
Quase sempre SHA-1, seis dígitos e baseado em tempo, porque é isso que os serviços realmente usam. Quando a exportação deixa um deles sem valor, o padrão convencional é aplicado e o campo é marcado como padrão, não como dado.
O link otpauth
Um URI otpauth:// padrão, remontado a partir dos campos acima em vez de decodificado, então ele é exatamente o que outro autenticador espera. Cada um também ganha um QR code, pronto para ser escaneado direto em outro app.
O período, rotulado com honestidade
Toda conta informa trinta segundos, e isso não é decodificado de nada. O formato de exportação tem campos para a chave secreta, o nome, o emissor, o algoritmo, a quantidade de dígitos, o tipo e o contador, e campo nenhum para o período. O Google Authenticator usa trinta segundos para tudo o que exporta, então é isso que é informado, marcado como padrão para que nunca seja confundido com algo que estava no código.
Contas baseadas em contador
Algumas contas são baseadas em contador em vez de baseadas em tempo, então o código delas não muda sozinho. O contador é exibido como foi exportado. Trate essas com cuidado: usar um código avança o contador no serviço, e uma cópia que ficou atrasada para de funcionar.
Como funciona
São cinco decodificações, uma depois da outra.
Nada disso é criptografia e nada disso precisa de servidor. A cadeia é curta o bastante para ser descrita por completo, o que vale a pena, porque a explicação de sempre é «instale estes três programas».
A ferramenta implementa as cinco por conta própria, sem código de terceiros. Ler o QR code é, de longe, a maior parte, porque o navegador não faz isso por você: o detector de códigos de barras nativo não existe no Safari nem no Firefox, então o decodificador foi escrito a partir da especificação.
01
Ler o QR code
A imagem é reduzida a preto e branco, os três padrões de localização dos cantos são encontrados, uma grade é ajustada por eles (em perspectiva, se a foto foi tirada de lado), cada módulo é amostrado, e a correção de erros Reed-Solomon conserta o que a câmera errou. Sai daí uma string que começa com otpauth-migration://offline?data=.
02
Decodificar o parâmetro data
Decodificar os escapes de porcentagem desse parâmetro dá base64 padrão, que decodifica para algumas dezenas de bytes. Vale citar uma armadilha: ele não pode ser lido com um analisador de parâmetros de URL, porque esses aplicam a decodificação de formulário e transformam o sinal de mais em espaço, e o base64 padrão usa sinais de mais.
03
Analisar o protocol buffer
Esses bytes são uma mensagem protobuf não documentada que guarda um registro de conta repetido, uma versão, o tamanho do lote, o índice do lote e um identificador de lote. Cada registro de conta tem sete campos: a chave secreta bruta, o nome, o emissor, e números que representam o algoritmo, a quantidade de dígitos, o tipo e o contador.
04
Recodificar a chave secreta em base32
A chave secreta chega como bytes brutos. Os apps autenticadores a exibem em base32, então os bytes são codificados de novo para produzir a string que você digitaria à mão em outro app.
05
Gerar um código para conferir
Um código baseado em tempo é um HMAC do intervalo atual de trinta segundos com essa chave, truncado em seis dígitos. A própria criptografia do navegador faz o HMAC, então não há criptografia caseira em nenhuma parte disto. Se o código bater com o que o seu telefone mostra, a extração está certa, e essa é a única conferência que realmente importa.
Privacidade
A afirmação é específica, e você pode testá-la.
Uma afirmação de privacidade que você não pode conferir é marketing. Então aqui está a afirmação exata, e o que você pode fazer em dez segundos para verificá-la.
A sua imagem e as suas chaves secretas nunca são transmitidas
A imagem que você solta, o payload decodificado, as chaves secretas e os códigos gerados ficam nesta aba. O código que lida com eles não tem nenhuma chamada a fetch, XMLHttpRequest, WebSocket, EventSource ou sendBeacon, e a versão offline acrescenta uma política de segurança de conteúdo, para que o navegador imponha isso em vez de acreditar na palavra do código.
O teste que vale fazer você mesmo
Desligue a rede, recarregue esta página a partir do cache ou abra a versão de arquivo único que você baixou, e use a ferramenta mesmo assim. Ela funciona. Nada que precisasse de servidor funcionaria.
O que esta página em si carrega
Sendo exato, porque a afirmação mais ampla seria falsa: esta página carrega um pequeno script de analytics hospedado por nós, que registra o endereço da página e nada mais. Ele não chega perto da ferramenta e não consegue ver o que você extrai. Se isso ainda incomodar você, a versão offline não tem referência externa de nenhum tipo.
Nada é armazenado
Sem cookies, sem armazenamento local, sem armazenamento de sessão, sem banco de dados, sem cache. Recarregar perde tudo o que você tinha extraído, o que é inconveniente uma vez e correto sempre.
O que limpar realmente faz
Limpar sobrescreve os bytes secretos com zeros. Vale fazer isso, e não é limpeza de memória: strings em JavaScript não podem ser sobrescritas, e o motor da linguagem pode manter cópias que nem nós nem você conseguimos alcançar. Fechar a aba é o que conclui o trabalho, e nenhuma página pode honestamente afirmar mais do que isso.
Publicado, e pequeno o bastante para ler
Tudo isso é um único pacote licenciado sob MIT, sem dependências em tempo de execução, então não há cadeia de suprimentos por trás dele para auditar. O decodificador de QR, o leitor de protobuf, os codecs base32 e base64 e as funções de senha de uso único estão todos nele, e os testes dele são fixados em vetores de teste publicados, em vez de nele mesmo.
Conseguir o código
Onde o código de exportação está escondido.
Ele não se chama chave de exportação nem backup, e não está nas configurações. O Google o arquiva na parte de mudar para um telefone novo, e é por isso que a maioria das pessoas nunca o encontra.
- 01Abra o Google Authenticator no telefone que tem as contas.
- 02Abra o menu e escolha «Transferir contas».
- 03Escolha «Exportar contas» e autentique-se quando for pedido.
- 04Marque as contas que você quer e continue. Aparece um QR code.
- 05Tire uma captura de tela desse código, ou aponte a câmera desta ferramenta para o telefone.
Se você receber mais de um código
O Google divide uma lista longa em vários QR codes e diz em qual deles você está. Capture todos e adicione um depois do outro. Eles compartilham um identificador e cada um traz o seu próprio índice, então se juntam em qualquer ordem e a ferramenta diz quais partes ainda faltam. Códigos de duas exportações diferentes são recusados em vez de combinados, porque contas sobrepostas de exportações separadas produziriam uma lista que nunca existiu no seu telefone.
Captura de tela em vez de fotografia
Uma captura de tela decodifica na primeira tentativa. A fotografia de uma tela acrescenta reflexo, moiré e perspectiva: o decodificador trata os três, e não precisa de nenhum. Se você estiver fotografando o telefone de outra pessoa, preencha o quadro com o código e mantenha-o de frente.
Depois
O que fazer com uma chave secreta depois de ter uma.
Mover para outro app
Cada conta ganha aqui o seu próprio QR code, no formato que todo autenticador lê, então você pode escaneá-lo direto em outro app. Digitar a chave em base32 à mão também funciona, e vale a pena se você quiser ter certeza de que nada foi escaneado errado.
Confira um código contra o telefone
Antes de depender de qualquer coisa disto, compare um código gerado com o que o Google Authenticator mostra para a mesma conta no mesmo momento. Se baterem, a chave está certa. Se não baterem, a chave está errada e nada mais no resultado importa.
Guarde como uma senha
Uma chave secreta pertence a um gerenciador de senhas, na entrada daquela conta, não a uma nota ou a uma planilha. Alguns gerenciadores geram os códigos para você se você colar o link otpauth. Vale pensar antes: um gerenciador que guarda a senha e o segundo fator é um ponto único de falha, o que pode ou não ser a troca que você quer.
Apague a captura
Inclusive do álbum «Apagados recentemente», e antes que a sua biblioteca de fotos a sincronize para algum lugar. Depois limpe a ferramenta e feche a aba.
Detalhe
Os detalhes concretos.
O que a ferramenta faz e o que não faz, sem marketing. Cada linha aqui é afirmada pelos próprios testes do pacote.
- Execução
- Inteiramente no seu navegador. Sem servidor, sem conta, nada para instalar.
- Leitura
- Códigos de exportação do Google Authenticator (otpauth-migration) e códigos otpauth de conta única
- Entrada
- Arrastar e soltar, colar, um seletor de arquivos ou a câmera do aparelho
- Saída
- Chave secreta em base32, emissor, nome da conta, algoritmo, dígitos, tipo, contador, link otpauth, um QR code de importação e um código ao vivo
- Rede
- Nenhuma. Sem fetch, XMLHttpRequest, WebSocket, EventSource ou sendBeacon em nenhuma parte da ferramenta.
- Armazenamento
- Nenhum. Sem cookies, armazenamento local, armazenamento de sessão, banco de dados ou cache.
- Offline
- Sim. Uma versão de arquivo único roda do seu próprio disco com a rede desligada.
- Navegadores
- Chrome, Edge, Firefox e Safari 16 ou mais novo. A câmera precisa de uma página segura, então pode não abrir a partir de um arquivo local.
- Dependências
- Nenhuma em tempo de execução. O codec de QR, o leitor de protobuf, os codecs base32 e base64 e as funções de senha de uso único estão todos no pacote.
- Licença
- MIT
Perguntas que valem a pena.
- É seguro colocar o meu código de exportação em um site?
- A resposta honesta é que você não deveria colocar uma credencial em uma página que não pode verificar, e é por isso que esta é verificável. Nada é transmitido, o código é publicado, e existe uma versão de arquivo único que você pode baixar e rodar com a rede desligada. Se você preferir não confiar em página nenhuma, use essa versão.
- Alguma coisa é enviada para os servidores de vocês?
- Não, e não há nada do nosso lado que pudesse receber isso. A decodificação, a análise e a geração de códigos rodam todas no seu navegador. Abra o painel de rede do seu navegador, extraia um código, e você não verá requisição nenhuma.
- Posso usar sem conexão com a internet?
- Sim. Baixe o arquivo HTML único na página de releases do repositório e abra-o. Ele não tem referência externa de nenhum tipo e traz uma política de segurança de conteúdo que proíbe conexões por completo. Tudo funciona, menos a câmera, que alguns navegadores não liberam para uma página aberta a partir de um arquivo; soltar ou colar uma captura de tela sempre funciona.
- Se alguém pegar o meu código de exportação, como eu o revogo?
- Não há como revogar uma chave secreta isoladamente. Desligue a autenticação em duas etapas no serviço afetado e configure de novo, o que emite uma chave nova e deixa a antiga inútil. Trocar a sua senha não faz isso, e apagar o app ou restaurar o telefone também não.
- O Google me deu vários QR codes. E agora?
- Capture todos e adicione um por um. Eles compartilham um identificador de lote e cada um traz o seu próprio índice, então se juntam em qualquer ordem e a ferramenta diz quais partes ainda faltam. Adicionar de novo um que você já tem não causa problema. Códigos de duas exportações diferentes são recusados em vez de juntados, porque a lista combinada seria uma que nunca existiu no seu telefone.
- Por que toda conta diz trinta segundos?
- Porque o formato de exportação não tem campo de período, e o Google Authenticator usa trinta segundos para tudo. O valor está certo e não é decodificado de nada, e é por isso que ele é rotulado como padrão em vez de exibido como dado. Se um serviço usasse um intervalo diferente, uma exportação deste app não diria isso a você.
- Uma das minhas contas tem um código que não muda.
- Essa é uma conta baseada em contador: o código não muda, e é assim que deve ser. O contador dela é exibido como foi exportado. Tome cuidado com ela: usar um código avança o contador no serviço, então uma cópia que ficou atrasada deixará de ser aceita.
- Quais algoritmos são suportados?
- SHA-1, SHA-256 e SHA-512, usando a própria criptografia do navegador. O MD5 aparece na lista de algoritmos do formato, mas os navegadores não conseguem calculá-lo, então nenhum código é gerado para ele; a chave secreta e todos os outros parâmetros continuam sendo devolvidos corretamente. Na prática, os serviços usam SHA-1 com seis dígitos, e o Google Authenticator ignora qualquer outra coisa de todo modo.
- A câmera não funciona.
- Ela precisa de uma página segura, então não abre por http simples e pode não abrir a partir de um endereço de arquivo. Uma recusa costuma ficar memorizada, então confira as configurações do site no seu navegador. Independentemente da câmera, soltar ou colar uma captura de tela funciona em todo lugar.
- Não abre a foto do meu iPhone.
- As fotos do iPhone são HEIC, e nenhum navegador além do Safari decodifica esse formato. Tire uma captura de tela em vez de uma foto, ou converta o arquivo para PNG ou JPEG. A captura de tela é a melhor entrada de qualquer forma, porque não tem reflexo nem perspectiva.
- Posso mover isso para outro autenticador?
- Sim. Cada conta tem o seu próprio QR code no formato otpauth padrão, que todo app autenticador lê, e você também pode digitar a chave em base32 à mão. Compare um código gerado com o do seu telefone antes de remover qualquer coisa dele.
- Já vi isso ser feito com o zbarimg e um programa em Go.
- São as mesmas três decodificações, com três instalações na frente delas: ler o QR code, decodificar o parâmetro data em base64, analisar o protobuf. Isto faz tudo em uma página, e o pacote por trás é publicado, caso você prefira automatizar. Nada aqui chama essas ferramentas; o decodificador de QR e o leitor de protobuf foram escritos a partir das especificações deles.
Seu para guardar, e seu para conferir.
Um único pacote licenciado sob MIT, sem dependências em tempo de execução. Leia, faça um fork, rode offline, ou simplesmente use aqui.
Ler o código-fonte