none
Como identificar um arquivo? RRS feed

  • Pergunta

  • Boa tarde a todos, tenho uma dúvida que pode parecer muito estranha, mas vamos lá:

    Suponhamos que meu programa crie um arquivo de texto,

     o usuário (mau intensionado) faz uma cópia deste arquivo e o renomeia para o mesmo nome do anterior,

    por fim o usuário substitui o arquivo original por esta cópia.

    Existe uma forma de saber se o arquivo não é o original? tentei usar a data de criação e modificação mas estas continuam as mesmas...

    Desde já agradeço

    segunda-feira, 15 de novembro de 2010 19:27

Respostas

  • Olá existe um jeito de fazer isto através do HASH de seu arquivo, ou seja, através dos algoritmos de criptografia de hash do .NET podemos pedir que seja gerada uma chave única para o arquivo (HASH), se houver qualquer alteração neste arquivo este HASH será mudado.

    Veja:

    //Importar as bibliotecas necessárias no topo do código
    using System.IO;
    using System.Security.Cryptography; 
    
    // C#
    // Passo 1: Criar o algoritimo de HASH
    MD5 myHash = new MD5CryptoServiceProvider();
    // Passo 2: Armazenar os dados do arquivo em um array de bytes
    FileStream file = new FileStream(@"c:\boot.ini", FileMode.Open, FileAccess.Read);
    BinaryReader reader = new BinaryReader(file);
    // Passo 3: Chamar o metodo HashAlgorithm.ComputeHash
    myHash.ComputeHash(reader.ReadBytes((int)file.Length));
    // Passo 4: Obter o HASH do arquivo
    string hash = Convert.ToBase64String(myHash.Hash);
    //Imprime o hash na tela (funciona somente para Console Application)
    Console.WriteLine(hash);

    Repare que eu estou lendo o arquivo c:\boot.ini, basta você substituir o caminho deste arquivo pelo caminho do arquivo do qual você deseja realizar esta verificação.

    O mais importante aqui é idenpendente do número de vezes que você executar este código o HASH do arquivo será sempre o mesmo até que qualquer informação do arquivo mude, sendo assim para realizar a validação desejada, em um primeiro momento você executaria o código acima e salvaria o HASH gerado em um banco de dados por exemplo, em um segundo momento você irá usar o mesmo código acima para comparar se o HASH do arquivo ainda é igual ao HASH salvo no banco de dados, se o HASH for igual então o arquivo não foi modificado, se for diferente quer dizer que o arquivo foi modificado.

    Este processo é bem parecido com o de assinatura digital, porém de maneira simplificada

    Espero ter ajudado

    • Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 16 de novembro de 2010 17:46
    • Marcado como Resposta Robotizar terça-feira, 16 de novembro de 2010 19:44
    terça-feira, 16 de novembro de 2010 17:22

Todas as Respostas

  • @Robotizar

    Nao existe forma de voce saber, como tu mesmo disseste, o copia e original tambem, por que nao foi alterada. a informacao e igual no ficheiro.

    A copia passa a ser diferente, apenas, se a copia for alterada, Data, informacao do texto,  ect, etc,

    A unica form de tentar prevenir alteracao no ficheiro ou nao permitir que o usuario altere ou renomeia o ficheiro, e por criar uma folder(pasta) com password.

    Dentro desta folder(Pasta) tu guardas os ficheiros txt.

    Sempre que se tentar abrir, ele vai pedir a password, assim ninguem altera.

     


    Just Be Humble Malange!
    terça-feira, 16 de novembro de 2010 00:44
    Moderador
  • Olá existe um jeito de fazer isto através do HASH de seu arquivo, ou seja, através dos algoritmos de criptografia de hash do .NET podemos pedir que seja gerada uma chave única para o arquivo (HASH), se houver qualquer alteração neste arquivo este HASH será mudado.

    Veja:

    //Importar as bibliotecas necessárias no topo do código
    using System.IO;
    using System.Security.Cryptography; 
    
    // C#
    // Passo 1: Criar o algoritimo de HASH
    MD5 myHash = new MD5CryptoServiceProvider();
    // Passo 2: Armazenar os dados do arquivo em um array de bytes
    FileStream file = new FileStream(@"c:\boot.ini", FileMode.Open, FileAccess.Read);
    BinaryReader reader = new BinaryReader(file);
    // Passo 3: Chamar o metodo HashAlgorithm.ComputeHash
    myHash.ComputeHash(reader.ReadBytes((int)file.Length));
    // Passo 4: Obter o HASH do arquivo
    string hash = Convert.ToBase64String(myHash.Hash);
    //Imprime o hash na tela (funciona somente para Console Application)
    Console.WriteLine(hash);

    Repare que eu estou lendo o arquivo c:\boot.ini, basta você substituir o caminho deste arquivo pelo caminho do arquivo do qual você deseja realizar esta verificação.

    O mais importante aqui é idenpendente do número de vezes que você executar este código o HASH do arquivo será sempre o mesmo até que qualquer informação do arquivo mude, sendo assim para realizar a validação desejada, em um primeiro momento você executaria o código acima e salvaria o HASH gerado em um banco de dados por exemplo, em um segundo momento você irá usar o mesmo código acima para comparar se o HASH do arquivo ainda é igual ao HASH salvo no banco de dados, se o HASH for igual então o arquivo não foi modificado, se for diferente quer dizer que o arquivo foi modificado.

    Este processo é bem parecido com o de assinatura digital, porém de maneira simplificada

    Espero ter ajudado

    • Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 16 de novembro de 2010 17:46
    • Marcado como Resposta Robotizar terça-feira, 16 de novembro de 2010 19:44
    terça-feira, 16 de novembro de 2010 17:22