Experimento de restauração de backup criptografado — somente dados artificiais Data da observação: 2026-09-03 O que foi medido ---------------- O experimento usa restic 0.19.1, Python 3.12.10 e Windows 11 amd64. Os doze arquivos gerados abrangem texto UTF-8, JSON, CSV, XML, ZIP, WAV e TOML. Não há documentos pessoais, fotografias, gravações reais nem credenciais reais. Este é um experimento local com um desenho específico. Ele não compara produtos de backup nem atribui uma classificação geral de segurança a eles. As execuções durante o desenvolvimento e a execução final registrada produziram as mesmas seis linhas de resultados; não foram testes independentes em máquinas diferentes. O repositório usa o formato 2. A compressão segue o padrão do restic (auto), e o uso de cache está desativado. Após cada backup bem-sucedido, o script obtém o ID completo do snapshot, a versão salva do backup. A restauração usa esse ID fixo e a subpasta artificial /source, nunca o identificador especial "latest". Cada destino de restauração é criado dentro da nova pasta raiz do experimento e está vazio. A opção --overwrite never também é aplicada. O manifesto dos doze arquivos pretendidos é preparado antes da exclusão de S4. O manifesto da versão atual necessária em S5 é preparado antes de salvar os arquivos da versão antiga. Em S6, o manifesto descreve os dados de origem deliberadamente inválidos e registra a falha na leitura do JSON antes de fazer o backup. Nem um snapshot incompleto nem a lista que ele próprio contém são tratados como referência do que se pretendia preservar. Cada verificação responde a uma pergunta diferente: * restic check: o repositório passa na verificação estrutural comum? * restic check --read-data: a leitura de todos os dados armazenados passa? * restic restore: a extração termina com código de saída 0? * Inventário: todos os caminhos esperados estão presentes, sem arquivos extras? * SHA256: cada arquivo restaurado esperado coincide com o manifesto prévio? * Leitura do formato: o leitor padrão indicado consegue interpretar cada arquivo? Resultados observados --------------------- Caso check read-data restore caminhos SHA256 formatos (arquivos presentes) S1 0 0 0 12/12 12/12 12/12 S2 12 12 12 0/12 0/12 não testados (0 arquivos) S3 0 1 1 11/12 11/12 11/11 S4 0 0 0 11/12 11/12 11/11 S5 0 0 0 12/12 11/12 12/12 S6 0 0 0 12/12 12/12 11/12 O código de saída 0 indica conclusão bem-sucedida. Nesta execução, 12 indica que a senha pública de teste estava incorreta; 1 informa um erro nos dados, na leitura ou na restauração. O JSON e o registro de comandos conservam as operações e seus diagnósticos separadamente. Um código zero não permite concluir que todas as necessidades de recuperação de uma pessoa foram atendidas. S1: Arquivos artificiais de origem sem alterações. Todos os caminhos, bytes e testes de leitura esperados passaram. S2: Uma senha pública de teste intencionalmente incorreta foi usada com uma cópia do repositório de S1. Nenhum arquivo foi restaurado. O caso testa a rejeição de uma senha incorreta usada como dado de teste, sem estabelecer a existência ou a ausência de outra chave de recuperação. S3: Um byte criptografado de um bloco de dados foi alterado em uma cópia descartável do repositório de S1. O bloco único de documents/records.json foi localizado pelo hash conhecido de seu conteúdo no índice do restic. Foi alterado o byte logo após seu nonce de 16 bytes, um valor usado na operação criptográfica. O tamanho e o cabeçalho do pack não foram modificados. A verificação comum passou; a leitura completa e a restauração falharam. Onze arquivos foram recuperados. Os IDs exatos do pack e do bloco, a posição do byte, os hashes do pack e o arquivo ausente estão em results.json. O resultado se refere a essa corrupção específica; a verificação comum pode detectar outros danos. S4: documents/contacts.csv foi excluído da seleção do backup depois de registrar o manifesto completo do que se pretendia preservar. Todas as operações do restic passaram, mas a comparação com o inventário independente e com os hashes de todos os arquivos esperados ficou em 11/12. S5: O snapshot completo mais antigo foi restaurado mesmo existindo um mais novo. documents/status.json contém a revisão 1, em vez da revisão 2 necessária. Os doze arquivos passam nos testes de formato, mas apenas onze correspondem ao manifesto da versão atual necessária. Os doze coincidem com o manifesto da origem antiga, mantido separadamente. A versão errada para o objetivo foi restaurada corretamente; o restic não introduziu danos nesse caso. S6: documents/records.json já contém JSON inválido antes do backup. A falha na leitura da origem está registrada em synthetic-manifests.json. Todos os bytes restaurados coincidem com os de origem, mas o mesmo leitor de JSON continua rejeitando o arquivo. A restauração não causou o conteúdo inválido. Como interpretar a coluna de testes de formato --------------------------------------------- Somente arquivos presentes são submetidos aos testes de leitura. Os ausentes aparecem na coluna de inventário e não podem ser contados como testes de formato aprovados. TXT usa decodificação UTF-8 estrita; JSON usa json.loads; CSV usa csv.reader(strict) e confere se todas as linhas têm o mesmo número de campos; XML usa ElementTree.parse; ZIP lê todos os itens e verifica seus CRCs; WAV lê todos os quadros de áudio declarados e verifica seu tamanho em bytes; TOML usa tomllib.loads. São operações reais de leitura e interpretação, não verificações da extensão do nome do arquivo. Elas não comprovam que um aplicativo de desktop exibirá todas as funções corretamente nem que o conteúdo atende às necessidades reais de uma pessoa. Arquivos públicos ----------------- restore-lab.py Código final para reprodução, só com a biblioteca padrão. results.csv Tabela numérica resumida. results.json Resultados por arquivo, IDs de snapshots, procedência dos binários, hash do script e detalhes da corrupção. synthetic-manifests.json Referências prévias do que se pretendia preservar e resultados dos testes de leitura dos arquivos de origem. command-log.json Comandos executados, códigos de saída e saídas padrão e de erro. Caminhos do experimento, nomes da conta de execução e campos de data e hora foram ocultados. Os resultados operacionais foram mantidos. lab-readme.txt Este registro de método e interpretação. Reprodução no Windows amd64 -------------------------- Requisitos: Python 3.11 ou posterior e o ZIP oficial indicado abaixo. A execução registrada usou Python 3.12.10. Salve restore-lab.py em uma nova pasta de trabalho. Baixe o ZIP oficial e compare seu SHA256 com o arquivo oficial SHA256SUMS. O script exige que os hashes do ZIP e do executável coincidam com os valores abaixo. Ele não baixa arquivos nem exige uma instalação do restic no sistema. Versão: https://github.com/restic/restic/releases/tag/v0.19.1 ZIP: https://github.com/restic/restic/releases/download/v0.19.1/restic_0.19.1_windows_amd64.zip Hashes oficiais: https://github.com/restic/restic/releases/download/v0.19.1/SHA256SUMS SHA256 do ZIP: da948ad707ed690426473aaba2046cd61f8f90f6f0e7dab6be0d5796531de67d SHA256 do executável extraído: b0dd1fd21eea5d8fe1325f55f7118213c21f36de8a261e04c0624a5ab9fd7830 Saída de versão observada: restic 0.19.1 compiled with go1.26.4 on windows/amd64 O hash do ZIP foi comparado com o valor obtido na mesma versão oficial via HTTPS. Não foi realizada uma verificação separada da assinatura da versão. Na nova pasta de trabalho, execute no PowerShell: python .\restore-lab.py --restic-zip .\restic_0.19.1_windows_amd64.zip O script cria uma pasta c07-restore-lab-* nova dentro da pasta de trabalho e exibe LAB_ROOT. Ele não aceita um repositório, uma pasta de origem ou um destino de restauração já existente. Recusa links simbólicos e pontos de nova análise do Windows (reparse points), incluindo junções. O ZIP é lido como bytes, e apenas o executável com o nome definido é extraído. A alteração destrutiva do teste fica restrita à cópia do repositório S3 criada nessa execução. Não há limpeza automática nem operação sobre dados reais. As cadeias fixas PUBLIC-SYNTHETIC-LAB-ONLY... são dados públicos de teste, sem segredo. Qualquer pessoa pode lê-las. Nunca as use para proteger arquivos reais. Os processos filhos do restic recebem esses valores em vez de herdar configurações RESTIC_*. Eles usam uma pasta de arquivos temporários dentro da nova raiz do experimento. Nenhuma variável de ambiente global ou configuração de VPN é alterada. Os resultados são gravados dentro de LAB_ROOT. Nada é copiado automaticamente para uma pasta de publicação. Cada nova execução cria outra raiz. Chaves aleatórias dos repositórios, IDs de snapshots e packs e tempos de execução variam entre execuções. O arquivo a ser danificado é determinado pelo hash conhecido de seu conteúdo. O hash do código publicado é calculado no início e conferido novamente ao término; alterar o script durante a execução impede sua finalização. Limitações ---------- O conjunto normal contém 2.330 bytes e é intencionalmente pequeno. O experimento não mede repositórios grandes, velocidade de restauração, taxas de falha de discos, vida útil de mídias, resistência de cópias em outro local ou desconectadas, recuperação de contas de nuvem, guarda de credenciais, recuperação de um sistema operacional inteiro, permissões, listas de controle de acesso, fluxos alternativos de dados, exibição em aplicativos ou suporte futuro a formatos. O sucesso de leitura se limita a esses arquivos artificiais e aos leitores usados. O experimento não oferece garantia sobre o backup de uma pessoa. Documentação oficial relacionada ------------------------------- https://restic.readthedocs.io/en/stable/045_working_with_repos.html https://restic.readthedocs.io/en/stable/050_restore.html https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html Os resultados publicados são observações da versão 0.19.1. O manual stable pode mudar depois. Por isso, foram preservados a saída de versão, o endereço da versão oficial, os hashes, os comandos e o código do experimento. Material didático adicional (2026-09-13) --------------------------------------- O novo script compara o registro de uma execução com a referência publicada. comparison-readme.txt explica a preparação, os resultados, as limitações e a geração da figura. Esse complemento técnico e a figura avulsa estão em inglês.