Segurança e Criptografia
A capacidade de compartilhar mensagens de forma segura, guardar segredos e identificar pessoas sempre foram importantes para a humanidade. Existem registros de que criptografia já era usada na Mesopotâmia para proteger informações há mais de 3500 anos.
Em períodos de guerra, tais habilidades se mostram ainda mais importantes. Alguns séculos antes de Cristo, espartanos já usavam cifras de transposição e militares romanos já possuíam um sistema de senhas. Os alemães fizeram uso pesado de criptografia durante a Segunda Guerra, o que também impulsionou muitos avanços na área de criptoanálise.
Segurança e privacidade estão entre os assuntos que mais despertam o meu interesse, especialmente as partes ligadas a diversas áreas relacionadas a criptografia como, por exemplo:
- Computação: algoritmos de chave simétrica, algoritmos de chave pública, funções de hash, técnicas de criptoanálise, deniable encryption esteganografia
- Matemática: matemática discreta, álgebra linear, teoria dos grupos
- História: cifras antigas, uso militar de criptografia em guerras
- Sociologia: discussões sociais, políticas e filosóficas que vez ou outra geram muita polêmica, leis como a RIPA do Reino Unido.
Como é fácil de perceber, criptografia é uma área bastante abrangente, o que não me permite entrar em muitos detalhes aqui. Detalhes sobre o funcionamento dos algoritmos, benchmarks e outras análises mais aprofundadas podem ser encontrados em livros e em outros sites. O objetivo deste post é falar apenas sobre alguns métodos de criptografia de mensagens e arquivos utilizando programas e algoritmos que eu uso e recomendo.
Criptografia de arquivos
Vim
Não é uma criptografia segura! (veja: https://dgl.cx/2014/10/vim-blowfish)
Encriptar arquivos
É possível encriptar arquivos (textos, imagens, etc) diretamente pelo Vim das seguintes maneiras:
-
ROT13
Um segredo pouco conhecido do Vim é o comando
g?[movimento]
, que aplica o ROT13 no trecho entre o início e o fim do movimento.O ROT13 é uma cifra de César com passo 13, o que faz com que o processo de codificação seja igual ao de decodificação.
Este tipo de criptografia é muito fraca para proteger um documento, mas tem algumas utilidades divertidas.
Exemplo: Digamos que você tenha aplicado o ROT13 apenas à segunda linha de um texto, que contém a resposta para a charada (em Português):
P: Por que tem uma cama elástica no polo norte? E: Cnen b hefb CBYNE!
Para ler a resposta é só aplicar o ROT13 novamente (
2Gg?$
ou:2 norm! g?$
):P: Por que tem uma cama elástica no polo norte? R: Para o urso POLAR!
Se você quiser encriptar um arquivo inteiro ou encontrou alguma mensagem obfuscada na internet, provavelmente o tr seja uma alternativa melhor que o Vim, pois não é necessário abrir o arquivo, basta redirecionar o stdin para
tr a-zA-Z n-za-mN-ZA-M
.Como exemplo deixo você testar o seguinte comando, uma homenagem a Bruce Schneier, criador do Blowfish e um dos mais importantes criptógrafos atuais. Retirada de schneierfacts.com
julio@acer ~> echo "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, \ ur'q pehfu lbhe fxhyy jvgu uvf ynhtu." | tr a-zA-Z n-za-mN-ZA-M
-
Utilizando o parâmetro -x pelo terminal
julio@acer ~> vim -x segredo.txt
O Vim pedirá uma senha para usar como chave de encriptação do arquivo.
Isso é válido tanto para novos arquivos quanto para arquivos já existentes.
Agora você terá que fornecer a senha todas as vezes que for editar o arquivo.
Ao digitar uma senha inválida você verá algo como
q,§Â²îu]2©^D!¸¡á^?%°ç]^[
.julio@acer ~> file segredo.txt segredo.txt: Vim encrypted file data
julio@acer ~> cat segredo.txt VimCrypt~01!xOî4QLÉ ©è¢i¶@h@$[¾M%
-
:X
Tem o mesmo efeito da opção anterior, o Vim pedirá para você digitar uma senha duas vezes e irá encriptar o arquivo usando a chave digitada.
Alterar a senha
Para mudar a senha basta usar o parâmetro +X no terminal, digitar senha antiga e depois a senha nova nas duas vezes que o Vim pedir.
julio@acer ~> vim +X segredo.txt
Remover a senha
Para remover a senha basta abrir o arquivo com o vim e apagar a opção key.
:set key=
Mudar o algoritmo de encriptação
O Vim possui dois algoritmos de chave simétrica:
-
pkzip
Não use, algoritmo fraco e fácil de crackear.
:setlocal cryptmethod=zip
-
Algoritmo forte. Recomendado.
:setlocal cm=blowfish
Perceba que cm
é apenas uma abreviação para cryptmethod.
Gnu Privacy Guard (GPG)
Uma desvantagem do Vim é que ele só permite utilizar dois algoritmos (Pkzip e Blowfish), que são relativamente fracos em algumas situações e ambos são apenas de chave simétrica, ou seja, o remetente (Alice) deve compartilhar a chave previamente com o destinatário (Bob).
Se Alice não possui nenhum meio de comunicação seguro com Bob, como fazer para passar a senha do arquivo encriptado de forma segura? Para isso existem algoritmos assimétricos. Alice pode simplesmente enviar a senha encriptada usando a chave pública de Bob.
O GPG é ideal para casos como esse, pois ele possui 3 algoritmos assimétricos e vários outros simétricos, inclusive o Blowfish e outros ainda mais fortes. Além de algoritmos de encriptação o GPG também possui alguns para hash e compressão.
Uma lista dos algoritmos disponíveis pode ser encontrada com o seguinte comando:
julio@acer ~> gpg --version
Supported algorithms:
Pubkey: RSA, ELG, DSA
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
CAMELLIA192, CAMELLIA256
Hash: <del>MD5</del>, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
Criptografia assimétrica
Gere seu par de chaves privada e pública
Um par de chaves é necessário para encriptação, descriptografia, assinatura e verificação.
As pessoas usarão sua chave pública para encriptar mensagens destinadas a você e você usará sua chave privada correspondente para decriptar essa mensagem. Portanto a chave pública pode ser distribuída publicamente, mas a chave privada deve ser mantida em segredo em algum lugar seguro.
-
Gere sua chave privada
julio@acer ~> gpg --gen-key
RSA 2048 deve ser suficiente (pode ir até 4096), desde que você use uma passphrase segura e não senhas suscetíveis a ataques de dicionário ou bruteforces simples.
Ou seja, nada de senhas curtas, senhas numéricas, nome do seu chihuahua ou palavras comuns.
A passphrase
_EsseÉ1SiteMuitoLegal!_
é muito melhor que_banana1_
, e tão forte quanto a senha_$%Sh4x0rq56lohap[3é-!_
, porém bem mais fácil de lembrar.Tirinha obrigatória nesse tipo de post: https://xkcd.com/936/
-
Gere uma versão ASCII da sua chave pública
julio@acer ~> gpg --armor --output juliopub.asc --export julio@juliobs.com
O
--armor
garante que a saída será ASCII (Base64)
Compartilhamento de chaves públicas
Depois de gerar um arquivo ASCII com sua chave pública, você pode compartilhá-lo com outras pessoas.
Elas terão que importar sua public key usando gpg --import
e você terá que fazer o mesmo para
mandar uma resposta:
julio@acer ~> gpg --import < alice.asc
Uma forma de verificar a autenticidade da chave pública da Alice é comparando o fingerprint
informado por ela com a saída de gpg --fingerprint
.
Importando uma chave privada
Importar chaves privadas pode ser útil em 3 casos:
- Você usa mais de um computador e quer poder decriptar mensagem em todos eles
- Você reformatou o disco e quer importar a chave privada que você fez backup
- Você faz parte de um grupo de pessoas que compartilha uma mesma chave
Para todos esses casos o comando é:
julio@acer ~> gpg --allow-secret-key-import --import private_key.asc
Encripte um arquivo
julio@acer ~> gpg --encrypt --recipient julio@juliobs.com segredo.txt
julio@acer ~> gpg --encrypt --armor --recipient julio@juliobs.com segredo.txt
O primeiro comando gera um arquivo binário chamado segredo.txt.gpg
e o segundo um arquivo de texto
chamado segredo.txt.asc
. Se você precisar colar a mensagem encriptada em um email use o segundo
(com --armor
), caso contrário o primeiro é preferível por gerar um arquivo menor:
julio@acer ~> file segredo.txt*; ls -lh segredo.txt*
segredo.txt: UTF-8 Unicode text
segredo.txt.asc: PGP message
segredo.txt.gpg: GPG encrypted data
-rw-r--r-- 1 julio users 163 Jun 10 20:58 segredo.txt
-rw-r--r-- 1 julio users 1.1K Jun 10 21:01 segredo.txt.asc
-rw-r--r-- 1 julio users 740 Jun 10 20:59 segredo.txt.gpg
Criptografia simétrica
-
Usando o algoritmo padrão AES128 (Antes era CAST-128)
julio@acer ~> gpg --symmetric lol.tt
-
Usando AES-256 (Rijndael)
AES-256 é um dos algoritmos mais fortes, sendo utilizado atualmente pelo governo americano para criptografar arquivos Top Secret
julio@acer ~> gpg --cipher-algo AES256 --symmetric segredo.txt
Criptografia Híbrida
Decripte um arquivo
julio@acer ~> gpg --output arquivo_decriptado.txt --decrypt segredo.txt.gpg
Digite sua senha quando ela for solicitada e o arquivo secreto será decriptado e salvo como
arquivo_decriptado.txt
.
Interface gráfica
Seahorse
Seahorse é um programa que facilita o gerenciamento de suas chaves. Ele também pode ser usado para criar chaves PGP, Secure Shell e armazenar senhas.
Ele pode ser instalado pelo seguinte comando:
julio@acer ~> sudo pacman -S seahorse
Kgpg
O Kgpg
é uma interface gráfica sobre o GPG.
Instale plugin gnupg para Vim
Para instalar é só copiar o plugin para ~/.vim/plugin
ou, se você usa Vundle
para gerenciar seus
plugins, basta adicionar Bundle 'git://gitorious.org/vim-gnupg/vim-gnupg.git'
ao .vimrc
e
executar :BundleInstall!
Agora você pode abrir arquivos .gpg
em precisar digitar gpg --decrypt
, o Vim pedirá sua senha.
Minha chave pública (gerada na etapa 1.2)
OpenSSL
Também podemos usar o OpenSSL para encriptar arquivos.
julio@acer ~> openssl aes-256-cbc -salt -in segredo.txt -out segredo.aes
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
julio@acer ~> cat segredo.aes
Salted_Ø$5ÝGa$´³1äÄõýÓË
julio@acer ~> openssl aes-256-cbc -d -salt -in segredo.aes -out segredo.txt
enter aes-256-cbc decryption password:
julio@acer ~> cat segredo.txt
Este arquivo é secreto!
Mcrypt
-
Instale o Mcrypt
julio@acer ~> sudo pacman -S mcrypt
-
Encripte um arquivo
julio@acer ~> mcrypt -a rijndael-128 segredo.txt Enter the passphrase (maximum of 512 characters) Please use a combination of upper and lower case letters and numbers. Enter passphrase: Enter passphrase: File segredo.txt was encrypted.
-
Decripte um arquivo
julio@acer ~> mcrypt -d segredo.txt.nc Enter passphrase: File segredo.txt.nc was decrypted.
7zip
O 7zip também permite encriptar arquivos com AES-256
julio@acer ~> 7z a -p -mem=AES256 -tzip segredo.7z segredo.txt
7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,2 CPUs)
Scanning
Creating archive segredo.7z
Enter password (will not be echoed) :
Verify password (will not be echoed) :
Compressing segredo.txt
Everything is Ok
julio@acer ~> 7z l -slt segredo.7z | grep Method
Method = AES-256 Deflate
Repare que apesar dos algoritmos serem os mesmos, existem diferenças nas implementações, o que faz com que um arquivo encriptado usando o OpenSSL não será decriptado usando o GPG, por exemplo.
Quebra de senhas
Existem alguns programas para descobrir a senha de arquivos usando ataques de dicionário, força bruta.
Posso recomendar o John the Ripper e o Ophcrack.
Já esqueci (mais de uma vez) a senha de arquivos criptografados, mas por sorte sabia mais ou menos qual era o padrão das senhas e fui capaz de criar dicionários para tentar quebrá-las.
Um desses casos foi uma imagem de disco sparsebundle
do macOS.
Primeiro eu precisei extrair o hash de forma que o John the Ripper conseguisse atacar:
$ dmg2john segredo.sparseimage > segredo.txt
Depois precisava criar um dicionário. Eu saiba que:
- Se a senha começar com um número, ele é 5, 7, 123 ou 321
- Palavra1, Palavra2 ou Palavra3 aparecem na senha
- O final é sempre -A, -B ou -C
Um jeito simples de criar um dicionário com todas as possibilidades de senhas que obedecem esses critérios é usando Perl:
perl -lwe "print for glob '{5,7,123,321,}{Palavra1,Palavra2,Palavra3}-{A,B,C}'" > wordlist.txt
Depois basta deixar o JTR fazer o ataque de dicionário:
john --fork=4 --wordlist=wordlist.txt segredo.txt
E verificar se ele conseguiu descobrir a senha:
$ john --show segredo.txt
segredo.sparseimage:123Palavra2-C::::segredo.sparseimage
1 password hash cracked, 0 left
VeraCrypt
(Trecho adicionado em 26 de janeiro de 2019)
O VeraCrypt é um fork do descontinuado TrueCrypt e é minha ferramenta favorita para encriptar discos que preciso acessar a partir do Linux, Windows e macOS.
Ele pode criptografar uma partição inteira ou criar, em um único arquivo, um container criptografado contendo um sistema de arquivos.
É possível escolher entre AES
, Serpent
, Twofish
, Camellia
, Kuznyechik
ou uma combinação
desses algoritmos. Ele também conta com várias funções hash como SHA-256
, SHA-512
, Streebog
e
Whirlpool
.
Outro recurso interessante do VeraCrypt são os hidden volumes, ou seja, volumes escondidos no final
de outros volumes.
Todo volume possui espaço para dois cabeçalhos. Se a senha inserida for do primeiro, então o volume
externo é descriptografado; se a senha for do segundo, então o volume escondido que será
descriptografado.
Isso permite a chamada negação plausível, pois é impossível provar a existência de um volume
escondido.
Criar um novo volume é bastante intuitivo.
Minha recomendação é utilizar NTFS
se o disco for utilizado no Windows, pois NTFS
é o único
sistema de arquivos suportado que possui journaling
. Se journaling
não for necessário, recomendo
o exFAT
.
Para montar um volume criptografado no macOS:
/Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --text --keyfiles="" --pim="0" --protect-hidden="no" /dev/disk3s5 /Volumes/Dev
Para desmontar:
$ /Applications/VeraCrypt.app/Contents/MacOS/VeraCrypt --dismount /dev/disk3s5
Links
- http://arstechnica.com/security/2012/08/passwords-under-assault/
- http://irtfweb.ifa.hawaii.edu/~lockhart/gpg/gpg-cs.html
- http://sleepyhead.de/howto/?href=crypt
- http://vim.wikia.com/wiki/Encryption
- http://www.activism.net/cypherpunk/manifesto.html
- http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html
- http://www.gnupg.org/gph/en/manual.html
- http://www.lockdown.co.uk/?pg=combi
- http://www.madboa.com/geek/gpg-quickstart/
- http://www.philzimmermann.com/EN/essays/WhyIWrotePGP.html
- http://www.theregister.co.uk/2009/11/24/ripa_jfl/
- http://www.theregister.co.uk/2010/06/28/brazil_banker_crypto_lock_out/
- http://www.wired.com/gadgetlab/2012/11/ff-mat-honan-password-hacker
- http://www.wirelessbrasil.org/wirelessbr/colaboradores/leonardo_vilela/tutorial_pgp.html
- https://en.wikipedia.org/wiki/Password
- https://wiki.archlinux.org/index.php/System_Encryption_with_LUKS_for_dm-crypt
- https://wiki.archlinux.org/index.php/Truecrypt
- Defcon: http://youtu.be/0WPny7wk960