Este é um problema fascinante. Eu tenho estado em situações semelhantes, onde fui obrigado a resolver um problema da maneira errada. Dito isto, não tenho conhecimento de um módulo de criptografia de uso geral que permita a você descriptografar arquivos estáticos enquanto são exibidos. Eu procurei por várias horas, mas não consegui encontrar nada. Isso não é surpreendente, pois parece um problema bastante especializado.
No entanto, vejo várias opções.
- Escreva seu próprio módulo C e implemente-o como um manipulador de filtro.
- Use mod_ext_filter e um executável externo 1 para descriptografar arquivo.
- Se todos os arquivos tiverem uma extensão específica, adicione um manipulador para chamar um script CGI para descriptografar e servir o arquivo. Por exemplo,
Action decrypt /cgi-bin/decrypt.pl
eAddHandler decrypt .html
farão com que todas as solicitações de arquivos terminados em .html chamem /cgi-bin/decrypt.pl, que precisará ler, descriptografar e exibir o arquivo. Consulte o link . - Use mod_php e mod_rewrite para descriptografar e exibir transparentemente arquivos estáticos de qualquer tipo de um ou mais localizações mais específicas.
Tomei a liberdade de implementar uma prova de conceito da quarta opção que compartilharei aqui. Eu escolhi o PHP neste exemplo porque é onipresente, ele geralmente contém as funções de criptografia necessárias, e é rápido, já que é um módulo do Apache escrito em C.
Supondo que todos os arquivos criptografados estejam armazenados em um diretório chamado data
e sejam criptografados usando a mesma chave, criei o diretório na raiz do meu documento e criei um arquivo criptografado usando o OpenSSL.
cd /var/www
mkdir data
echo 'This is my plaintext content.' | openssl aes-256-cbc -a -k secret -out data/test.txt
Em seguida, criei decrypt.php
no meu documento raiz com o seguinte conteúdo:
<?php
# NOTE: This is proof-of-concept code. You should audit it for security before
# using it in a production environment.
# The key to use to decrypt the files
$key = 'secret';
$filename = $_SERVER["DOCUMENT_ROOT"] . htmlspecialchars($_SERVER['REQUEST_URI']);
$data = file_get_contents($filename);
$plaintext = decrypt($key, $data);
# Determine the MIME type of the decrypted content
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$content_type = finfo_buffer($finfo, $plaintext);
finfo_close($finfo);
header("Content-type: $content_type");
print $plaintext;
function decrypt($password, $encrypted_data) {
$encrypted_data = base64_decode($encrypted_data);
$salt = substr($encrypted_data, 8, 8);
$cyphertext = substr($encrypted_data, 16);
$password = $password . $salt;
$md5_hash = array();
$md5_hash[0] = md5($password, true);
$result = $md5_hash[0];
$rounds = 3;
for ($i = 1; $i < $rounds; $i++) {
$md5_hash[$i] = md5($md5_hash[$i - 1] . $password, true);
$result .= $md5_hash[$i];
}
$key = substr($result, 0, 32);
$iv = substr($result, 32,16);
return openssl_decrypt($cyphertext, 'aes-256-cbc', $key, true, $iv);
}
?>
Se o seu conteúdo não for codificado em base64, você poderá remover a primeira linha da função de decriptografia que ler $encrypted_data = base64_decode($encrypted_data);
.
Finalmente, na minha configuração do Apache, adicionei as seguintes entradas:
<directory /var/www/>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^data/ /decrypt.php [L]
</directory>
Agora, qualquer arquivo solicitado de http://www.example.com/data
será descriptografado e exibido, inclusive de subdiretórios. Como a condição de reescrita está limitando a reescrita aos arquivos, os índices de diretório ainda funcionam. Eu tenho o script PHP determinar o tipo MIME do conteúdo descriptografado e atualizar o cabeçalho de acordo para que eu possa servir imagens criptografadas, documentos, páginas da web e assim por diante.
Isso provavelmente não será tão rápido quanto um módulo personalizado do Apache, mas deve estar próximo. Se você estiver indo para servir um monte de conteúdo criptografado e desempenho é um problema, você pode ser capaz de acelerar um pouco as coisas, instalando o Cache PHP Alternativo para que a página PHP não precise ser compilada para cada solicitação.
Por favor, tenha em mente que você pode precisar aumentar as configurações para o uso de memória do PHP se você estiver descriptografando arquivos grandes.
1 Você disse que sente que esta opção é um hack. Por quê? Embora o resultado possa ser lento, mod_ext_filter é um módulo principal suportado e fará o trabalho assim que você escrever um programa de filtro para ser usado.