Também disponível em: English · Español · Français · العربية
Encriptar texto online
Cifra com palavra-passe através de AES-256-GCM, executada pelo seu próprio navegador, com os parâmetros escritos dentro do resultado e os limites escritos na página.
O que é cifrar um texto
Cifrar um texto é transformá-lo de modo que só o volte a ler quem tiver a chave certa. Esta ferramenta faz isso com uma palavra-passe escolhida por si: escreve uma mensagem, escreve uma palavra-passe e obtém uma única linha de texto que não significa nada para quem não tiver essa palavra-passe. Cole essa linha mais tarde com a mesma palavra-passe e a mensagem original volta exactamente na mesma.
A cifra é AES-256-GCM, a escolha padrão para este trabalho e que vem incorporada em todos os navegadores. O GCM é um modo autenticado, e isso conta mais do que parece: não se limita a esconder a mensagem, detecta também qualquer alteração feita nela. Mude um único bit do texto cifrado e a decifragem recusa-se em vez de devolver algo plausível mas falso.
Só que uma palavra-passe não é uma chave, e é nessa distância que está quase toda a engenharia interessante. O AES-256 quer uma chave de 256 bits uniformemente aleatória; o utilizador quer escrever uma coisa de que se lembre. Vencer essa distância é o trabalho de uma função de derivação de chave, e aqui essa função é o PBKDF2 com 600 000 iterações de HMAC-SHA256, o número que a OWASP publica na sua Password Storage Cheat Sheet. Tudo corre no seu navegador através da Web Crypto API. Nada é enviado e não há conta.
Como usar
- Escolha Cifrar e escreva a sua mensagem. Serve qualquer texto: acentos, árabe, chinês e emojis sobrevivem à ida e à volta, porque o texto é convertido em bytes UTF-8 antes de a cifra sequer o ver.
- Escreva uma palavra-passe e carregue em Cifrar. Há uma pausa curta enquanto a chave é derivada; essa pausa é precisamente a medida de segurança, e a ferramenta diz-lhe quantos milissegundos demorou na sua máquina. Copie a linha resultante e guarde-a ou envie-a como quiser.
- Para a recuperar, mude para Decifrar e cole a linha. Escreva a mesma palavra-passe e carregue em Decifrar. Se falhar, a ferramenta di-lo, mas não lhe pode dizer se a palavra-passe estava errada ou se o texto foi alterado: essas duas coisas são de facto indistinguíveis, por uma razão explicada mais abaixo.
O navegador oferece uma única função de derivação, e é a que a OWASP põe em último
Esta é a parte que quase nenhuma ferramenta conta, e vale a pena dizê-la tal como é em vez de a enfeitar. A Web Cryptography API do W3C, que é a especificação por trás da criptografia incorporada nos navegadores, define exactamente quatro algoritmos capazes de derivar uma chave: ECDH, X25519, HKDF e PBKDF2. Dois deles servem para acordar uma chave entre duas partes, e o HKDF foi pensado para material que já é uniformemente aleatório, coisa que uma palavra-passe humana decididamente não é. Sobra um: o PBKDF2.
Entretanto a Password Storage Cheat Sheet da OWASP ordena as funções de hash de palavras-passe por preferência e fá-lo sem ambiguidade: primeiro o Argon2id, depois o scrypt, depois o bcrypt e em quarto lugar o PBKDF2. E recomenda o PBKDF2 especificamente para o caso em que é preciso cumprir a FIPS-140, o que é um motivo regulamentar e não criptográfico. Ou seja, o navegador dá a uma página web exactamente uma opção, e ela é a que a OWASP deixa em último.
O PBKDF2 está no fundo da lista porque não é duro em memória. O seu trabalho é cálculo puro, que é justamente a forma de trabalho que uma placa gráfica faz aos milhares em paralelo. O Argon2id foi desenhado para sair caro também em memória, e não só em tempo, de maneira a encolher a vantagem do hardware do atacante. Pôr o Argon2id num navegador significa descarregar uma compilação em WebAssembly, um custo real pago em cada visita para uma página que talvez seja usada uma única vez.
Por isso esta ferramenta usa o PBKDF2 com o número que a OWASP publica, e di-lo, em vez de deixar entender que a escolha foi feita por mérito. Se está a proteger algo em que a diferença entre PBKDF2 e Argon2id lhe importa mesmo, isso é sinal de que devia estar a usar um programa instalado e não uma página web, que é exactamente a conclusão a que a secção dos limites chega por outro caminho.
O que 600 000 iterações compram na verdade: cerca de 19 bits
Todas as ferramentas desta categoria anunciam o seu número de iterações, e o número está ali para tranquilizar. Esta é a parte que quase nunca se imprime ao lado. Correr a derivação 600 000 vezes multiplica por 600 000 o custo de cada tentativa do atacante. Expresso como a força criptográfica costuma exprimir-se, isso é dois elevado a 19,19, portanto o número de iterações inteiro vale cerca de dezanove bits.
Dezanove bits é um contributo real e não é grande. Quer dizer que quem conseguisse experimentar mil milhões de palavras-passe por segundo contra um hash desprotegido fica reduzido a cerca de mil e setecentas por segundo. Isso é um obstáculo sério para quem tente adivinhar uma palavra-passe tirada de um espaço grande, e quase obstáculo nenhum para quem vá percorrendo uma lista de palavras-passe comuns. As iterações mexem na linha; a palavra-passe decide de que lado dela o utilizador cai.
A consequência prática é que a palavra-passe fornece essencialmente toda a segurança e as iterações acrescentam por cima um extra fixo de cerca de dezanove bits. Uma palavra-passe de quatro palavras escolhidas ao acaso de uma lista grande vale por si só bastante mais do que esse extra. Uma palavra-passe curta, ou que apareça em qualquer fuga de dados, continua a ser uma palavra-passe curta depois de 600 000 iterações: o factor de trabalho multiplica o custo de cada tentativa, mas não aumenta quantas tentativas o atacante tem de fazer.
A ferramenta mostra-lhe o tempo de derivação na sua própria máquina exactamente pelo mesmo motivo. Quem decide o que essas iterações custam de facto é o seu navegador e o seu hardware, e não um número medido noutro sítio, e ver o número torna a troca concreta em vez de abstracta.
O resultado descreve-se a si próprio, de propósito
O texto cifrado é uma só linha com cinco campos separados por pontos: uma marca de versão, o número de iterações, o sal, o nonce e por fim o texto cifrado com a sua etiqueta de autenticação. As três partes binárias vão em base64url, portanto o conjunto sobrevive a ser colado num email, numa conversa ou num URL sem que nada o estrague.
O número de iterações está dentro do resultado deliberadamente. A OWASP revê o seu número recomendado em alta à medida que o hardware melhora, já o mexeu várias vezes e voltará a mexer. Uma ferramenta que fixe esse número no código, tanto a cifrar como a decifrar, perde em silêncio a capacidade de ler os seus próprios resultados antigos no dia em que actualizar essa constante. Como aqui o número viaja com o texto cifrado, o que cifrar hoje continuará a decifrar-se daqui a anos, quando o valor por omissão já tiver mudado. O mesmo vale para o sal e para o nonce: ambos são aleatórios, ambos são precisos para decifrar e por isso ambos ficam guardados em vez de recalculados.
Esse desenho tem um gume que convém nomear, porque é o género de coisa que um formato autodescritivo introduz sem avisar. Se o número de iterações vem do texto colado, então o texto colado controla quanto trabalho o seu navegador faz antes sequer de verificar qualquer palavra-passe, e um texto hostil que dissesse ter um bilião de iterações bloquearia simplesmente o separador. Por isso a ferramenta põe um tecto ao número que aceita e recusa o que passe disso em vez de começar a trabalhar.
No painel de decomposição vêem-se mais dois pormenores. Para cada cifragem é gerado um sal aleatório novo e um nonce aleatório novo, e é por isso que cifrar duas vezes a mesma mensagem com a mesma palavra-passe dá dois resultados completamente diferentes: isso é o comportamento correcto e não uma falha. E a etiqueta de autenticação tem 128 bits, exactamente 16 bytes de acréscimo. A Web Crypto permite etiquetas de 32, 64, 96, 104, 112, 120 ou 128 bits e usa 128 por omissão; as curtas são bastante mais fáceis de forjar, portanto esta ferramenta fixa o máximo em vez de se fiar no valor por omissão.
Limites honestos
Cifrar dentro de uma página web não o protege da página web. O JavaScript que faz o trabalho é servido por este sítio de cada vez que o carrega, e se esse código alguma vez fosse malicioso, por um compromisso, por uma dependência envenenada ou por uma alteração deliberada, poderia ler a sua palavra-passe e o seu texto em claro antes de se cifrar o que quer que fosse. De fora não consegue verificar que não o faz. Isto não é um defeito do AES nem desta implementação: é a condição estrutural de fazer criptografia numa página servida por outra pessoa, e aplica-se igualmente a todas as ferramentas de cifra no navegador, incluindo as que não o mencionam.
O que esta ferramenta lhe dá mesmo é protecção para uma mensagem que está guardada noutro sítio. Se cifrar uma nota e a colar num email, num documento partilhado, numa aplicação de notas ou num histórico de conversa, quem depois obtiver esse texto sem a palavra-passe não o consegue ler. Esse é um cenário real e frequente, e a ferramenta serve-o bem. O que não pode fazer é protegê-lo de alguém decidido que o vise especificamente, porque quem o visa tem melhores opções do que atacar o texto cifrado. Para esse trabalho, use um programa auditado que tenha instalado e possa verificar.
Uma decifragem falhada não lhe pode dizer porque falhou. O AES-GCM verifica a etiqueta de autenticação e comunica um único resultado perante qualquer discrepância, e a especificação define exactamente um erro para isso. Uma palavra-passe errada e um único carácter alterado produzem o mesmo desfecho, e nenhum cuidado na implementação os consegue separar: essa informação simplesmente não existe. A ferramenta di-lo em vez de adivinhar, porque uma ferramenta que afirmasse saber estaria a inventar.
Não há recuperação de palavra-passe, e não pode haver. Da sua palavra-passe não fica nada guardado em lado nenhum, que é precisamente o que faz a cifra valer alguma coisa; a consequência inevitável é que perdê-la significa perder o texto para sempre. Por fim, isto cifra texto e não ficheiros: a mensagem passa pelo navegador como texto, portanto os anexos binários ficam fora do que esta página faz.
Porque é grátis
Porque não custa nada manter. Tudo isto, a derivação da chave, a cifragem e a decifragem, acontece dentro do seu próprio navegador usando a Web Crypto API que já lá está. Não se descarrega biblioteca nenhuma, não se envia texto nenhum para lado nenhum e nenhum servidor vê a sua mensagem nem a sua palavra-passe, porque não há servidor nenhum pelo meio.
Portanto não há conta, nem registo, nem nada guardado atrás de um, nem marca de água. A cifra é o AES-256-GCM do próprio navegador, o número da derivação sai das recomendações publicadas pela OWASP, e o formato está documentado acima para que o resultado não fique refém de este sítio continuar a existir.