Criptografar arquivos com OpenSSL

Posted on qui 22 agosto 2019 in HowTo

Eis aqui um mini tutorial de como podemos criptografar arquivos utilizando Openssl. Estas orientações se aplicam à maioria das distribuições Linux, sejam para servidores como para desktops, que possuam o OpenSSL devidamente instalado.

O conteúdo deste artigo foi baseado em outros dois tutoriais encontrados via Google: ShellHacks e outro do blog de Alexei Czeskis

Criptografar utilizando uma senha

Tipo 1

Para criptografar utilizando uma senha e o OpenSSL, eis o comando abaixo. O parâmetro -a faz com que o arquivo de saída esteja apropriadamente codificado em base64. Ainda o -salt é altamente recomendável quando se utiliza uma senha para criptografar.

openssl enc -aes-256-cbc -salt -a -in file.txt -out file.txt.enc

Obs.: Este comando termina com um warning, pois este procedimento será considerado obsoleto por causa de ataques de força bruta.

Para descriptografar:

openssl enc -aes-256-cbc -d -a -in file.txt.enc -out file_recuperado1.txt

Para um procedimento mais resiliente a ataques de força bruta, adicionar -pbkdf2 e -iter :

 openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000 -salt -in file.txt -out file.txt.enc2

Porém , para desciptografar,será imprescindível lembrar de todos os parâmetros e valores utilizados:

openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000 -d  -in file.txt.enc2 -out file_recuperado2.txt

Criptografar utilizando um par de chaves

Tipo 2

Este procedimento é mais adequado para arquivos regulares, e se vale apenas de um par de chaves RSA.

se você não possui um par de chaves, você pode criá-las:

#chave privada
openssl genrsa -out /caminho_da_chave/keyfile.key 4096

#chave pública
openssl rsa -in /caminho_da_chave/keyfile.key -pubout -out /caminho_da_chave/keyfile.pub

Então, uma vez distribuída a chave pública, para criptografar:

cat texto_para_criptografar.txt | openssl rsautl -encrypt -pubin -inkey /caminho_da_chave/keyfile.pub > texto_para_criptografar.txt.enc

O resultado é um arquivo binário.

Para descriptografar, obviamente utilize a chave privada:

cat texto_para_criptografar.txt.enc | openssl rsautl -decrypt -inkey /caminho_da_chave/keyfile.key > recuperado.txt

Criptografar arquivos maiores

Tipo 3

Por questões de performance, é possível utilizar uma "chave simétrica" descartável para criptografar os arquivos, e então criptografar esta chave com a chave pública.

Primeiramente, gere a chave simétrica de forma genérica (o número é o tamanho do arquivo):

openssl rand -out secret.key 128

Depois, o arquivo em questão é criptografado:

openssl aes-256-cbc -in arquivo.pdf -out arquivo.pdf.enc -pass file:secret.key 

Por último, é criptografada a chave genérica:

openssl rsautl -encrypt -oaep -pubin -inkey /caminho_da_chave/keyfile.pub -in secret.key -out secret.key.enc

a chave genérica original poderá ser descartada

rm secret.key

Neste cenário seriam armazenados ou repassados tanto o arquivo da chave simétrica criptografada, como o arquivo criptografado. Esta chave genérica criptografada é imprescindível para recuperação do arquivo.

Para descriptografar, primeiro se recupera a chave genérica utilizando a chave privada:

 openssl rsautl -decrypt -oaep -inkey /caminho_da_chave/keyfile.key -in secret.key.enc -out secret.key

Em seguida, é recuperado o arquivo:

openssl aes-256-cbc -d -in arquivo.pdf.enc -out saida.pdf -pass file:secret.key

Assim, a ideia seria não reaproveitar esta chave genérica para outros arquivos.