Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

Gerando o MD5 a ser impresso no cupom fiscal

Breve explicação do requisito IX do roteiro de homologação, a partir da versão 1.05.

Tenho sido questionado nos últimos dias sobre a nova regra do requisito IX do roteiro, aplicado a partir da versão 1.05.

 

Vamos analisar o texto.

 

ITEM 1: O PAF-ECF deve, a cada inicialização:

 

Logo na descrição já indica que deverá ser executado esta rotina toda vez que o aplicativo for inicializado, ou seja, no Delphi deverá se adicionado no evento “OnShow” do formulário principal;

 

a) gerar, por meio do algoritmo Message Digest-5 (MD-5), código de autenticação para cada arquivo

executável que realize os requisitos estabelecidos nesta especificação;

b) gerar um arquivo texto contendo a lista de arquivos autenticados, e seus respectivos códigos MD-5;

 

Nos itens “a” e “b” dizem para gerar um código MD5 para cada executável que fizer parte do PAF-ECF e armazenar em um arquivo do tipo “.TXT”. O arquivo deverá ficar mais ou menos assim:

 

C:\PAF_ECF\Configura.exe - a79fdb1100bc785fd2abe545686c2712

C:\PAF_ECF\Retaguarda.exe - 2eb6f562cf2ef6b6b66ed714c9413d47C

C:\PAF_ECF\PAF_ECF.exe - f32e0be6eba2c53983f9d767c5b0011d

C:\PAF_ECF\Sintegra.exe - f2151c0cf348cfa062b9569d9695488b

 

c) gerar, por meio do algoritmo Message Digest-5 (MD-5), código de autenticação do arquivo TXT a

que se refere a alínea “b” e gravar o resultado no arquivo auxiliar criptografado e inacessível ao

estabelecimento usuário de que trata o item 4 do Requisito XXII, sobrepondo à gravação anteriormente

realizada, devendo este código ser impresso no Cupom Fiscal, no campo:

 

Já no item “c”, diz que deverá ser gerado o MD5 do arquivo texto criado anteriormente com a lista de executáveis, e armazenar de forma criptografada, junto com o Serial e GT da impressora no arquivo auxiliar de verificação, referido no requisito XXII.

 

c1) "informações complementares", no caso de ECF que disponibilize este campo, devendo utilizar este

campo para esta informação e iniciando a impressão na primeira coluna da primeira linha;

c2) "mensagens promocionais", no caso de ECF que não disponibilize o campo "informações

complementares", devendo utilizar a primeira linha para esta informação e iniciando a impressão na

primeira coluna da primeira linha.

 

No complemento do item “c”, diz para imprimir este MD5 do arquivo “.TXT”, que foi armazenado no arquivo auxiliar, na primeira coluna da primeira linha do campo de mensagem promocional, usada para realizar o fechamento do cupom fiscal, ou seja, em todos os cupons fiscal impressos, deverá ter este MD5 no fechamento, como primeira informação.

 

Este requisito é uma forma de garantir que não haverá alterações no aplicativo homologado, pois uma vez que tenha alguma alteração no executável, o código MD5 não será mais o mesmo. E mesmo que não haja alteração na fonte do executável, o simples fato de re-compilar o mesmo, acarretará em mudança no MD5.

 

Segue abaixo o script da função que uso para realizar esta operação;

 
function GeraMD5PAFECF: String;

var Arquivo : TextFile;

    NomeArq, ArqTexto, aMD5 : String;

    F: TSearchRec;

    Ret: Integer;

begin

  Result := '';

  try

    // Apaga arquivo anterior

    ArqTexto := ExtractFilePath(Application.ExeName)+'ArqMD5.txt';

    if FileExists(ArqTexto) then

       DeleteFile(ArqTexto);

    // cria o arquivo TXT na mesma pasta do sistema

    AssignFile(Arquivo,ArqTexto);

    ReWrite(Arquivo);

    // lista todos os arquivo exe da pasta do aplicativo e gera o MF5

    Ret := FindFirst(ExtractFilePath(Application.ExeName)+'\*.exe', faAnyFile, F);

    try

      while Ret = 0 do

      begin

        if F.Attr and faDirectory <> faDirectory then

        begin

          NomeArq := ExtractFilePath(Application.ExeName)+'\'+F.Name;

          aMD5    := MD5Print(MD5File(NomeArq));

          WriteLn(Arquivo,NomeArq+' - '+aMD5);

        end;

        Ret := FindNext(F);

      end;

    finally

      FindClose(F);

    end;

    Closefile(Arquivo);

    // gera MD5 do arquivo texto

  finally

    Result := MD5Print(MD5File(ArqTexto));

  end;

 

end;

 
Será disponibilizado para download o um simples aplicativo para exemplo.




    17 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Marcio Provenzano
Ola, Luis!
No artigo ficou faltando a funcao MD5Print(MD5File(ArqTexto));

Voce poderia passa-la?

Obrigado, assistencia@cmbalancas.com.br


em 23/10/2010 11:19 - Responder

 

[Comentário do autor]   Luis Carlos Godinho
No topo da pagina tem o arquivo exemplo para download.
 
Abs!


em 23/10/2010 22:45 - Responder
 

Antonio Adérito Barbosa Justino
Não estou conseguindo degar o MD5 do programa executável atual, diz que o programa está em uso ao gerar o Hash do dele para o arquivo txt. Como você conseguio fazer isso?




em 22/10/2010 15:15 - Responder

 

[Comentário do autor]   Luis Carlos Godinho
Olá Antonio!
 

Não é pra acontecer isso, pois a rotina deve ficar no onshow do formulário e com certeza neste momento o executável esta em uso. Você baixou o aplicativo exemplo que esta disponível no topo da página. Caso não tenha baixado, dê uma olhada lá, pois no exemplo esta fazendo certinho.

Abs!



em 22/10/2010 16:04 - Responder
 

Êmeris Santos
Olá Luiz, bom dia.
 
Gostaria de saber qual a possibilidade de rodar esta unit uMD5 no delphi 2010. Quando executado a aplicação dá erro de acces violation. Se puder disponibilizar uma versão para delphi 2010, desde já te agradeço.


em 4/11/2010 12:55 - Responder

 

[Comentário do autor]   Luis Carlos Godinho
Olá Emeris!
 
Para funcionar no delphi 2010 você terá que alterar na Unit MD5.pas os tipos de variáveis string para AnsiString.
Exemplo:
 
function MD5String(M: string): MD5Digest;
para
function MD5String(M: AnsiString): MD5Digest;
function MD5File(N: string): MD5Digest;
para
function MD5File(N: AnsiString): MD5Digest;
 
function MD5Print(D: MD5Digest): string;
para
function MD5Print(D: MD5Digest): AnsiString;
 
Abs!

 


em 4/11/2010 14:25 - Responder
 

  W7 Solucoes Ltda
Bom dia Luiz...
Tenho tentado acompanhar seus artigos...porem nem todos eu consigo por não ter credito...
Mas está de parabéns...
 
Sobre esse artigo eu tentei rodar ele e não deu certo, apresentou o erro abaixo.
 
 
A função usada
 
function Tfrm_principal.GeraMD5PAFECF: string;
var
  Arquivo           : TextFile;
  NomeArq, ArqTexto, aMD5: string;
  F                 : TSearchRec;
  Ret               : Integer;
begin
  Result := '';
  try
    // Apaga arquivo anterior
    ArqTexto := ExtractFilePath(Application.ExeName)+'ArqMD5.txt';
    if FileExists(ArqTexto) then
      DeleteFile(ArqTexto);
    // cria o arquivo TXT na mesma pasta do sistema
    AssignFile(Arquivo, ArqTexto);
    ReWrite(Arquivo);
    // lista todos os arquivo exe da pasta do aplicativo e gera o MF5
    Ret := FindFirst(ExtractFilePath(Application.ExeName)+'\*.exe', faAnyFile, F);
    try
      while Ret=0 do
        begin
          if F.Attr and faDirectory<>faDirectory then
            begin
              NomeArq := ExtractFilePath(Application.ExeName)+'\'+F.Name;
              aMD5 := MD5Print(MD5File(NomeArq));
              WriteLn(Arquivo, NomeArq+' - '+aMD5);
            end;
          Ret := FindNext(F);
        end;
    finally
      FindClose(F);
    end;
    Closefile(Arquivo);
    // gera MD5 do arquivo texto
  finally
    Result := MD5Print(MD5File(ArqTexto));
  end;
end;


em 2/12/2010 11:44 - Responder
 

[Comentário do autor]   Luis Carlos Godinho

Olá!

A mensagem esta dizendo que aplicação esta tentando gravar um string de 34 caracteres dentro de um campo que permite no maximo 32.
Esta mensagem normalmente esta ligada a gravação de dados no banco, o que não ocorre na rotina citada no artigo.
Revise o código através de um debug e veja exatamente onde acontece o erro.
 
Abs!


em 2/12/2010 15:48 - Responder
 

  W7 Solucoes Ltda
Boa Tarde Luiz...
Realmente foi um equivoco meu...tava passando o resultado para um string porem não tinha setado o seu tamanho para 32 e quando manda para gravação dava o erro.
 
Obrigado
 
PS.: A unica coisa que gostaria é que os materiais acabem disponiveis num todo para assinantes...pois ficar comprando creditos, a empresa não liberou...


em 2/12/2010 16:51 - Responder
 

Joel Dsdsdsd
Opa, Luis... Estou utilizando seu código para tentar gerar o MD5 do executável.

Estou utilizando o delphi 2010 e já alterei todas as ocorrências de String da Unit MD5 para AnsiString.

Aperentemente está tudo ok. Porém, sempre que compilo está sendo gerado o mesmo md5 sempre, inclusive o mesmo md5 que é gerado quando executo sua aplicação exemplo (compilada em delphi 2010) - o md5 que se recebo como retorno é D41D8CD98F00B204E9800998ECF8427E e o comando que utilizei neste meu caso foi:

MD5Print(MD5File(Application.ExeName));

Você teria alguma sugestão para a solução desse problema?!


em 14/1/2011 17:10 - Responder

 

[Comentário do autor]   Luis Carlos Godinho
Olá Joel!
 
Tive algumas informações que as rotinas da Unit MD5.pas não estçao funcionando corretamente no D2010. Não sei se procede pois não tive como realizar os testes.
Tem um usuário "EMERIS SANTOS" que utilizou pelo D2010, não sei se ele conseguiu.
 
Abs!


em 14/1/2011 17:30 - Responder
 

Acomais Ltda
Fala Godinho, olha eu aqui denovo.
ainda não terminei de ler todo o roteiro do paf, mas fiquei com uma duvida nessa sua aula: o aplicativo paf (ou seja, o executavel do paf) vai gerar um arquivo txt com todos os executaveis que estão no diretorio (que sub-entende que sejam os executaveis homologados), mas por que o retaguarda está ali? vou ter que homologar meu retaguarda tambem? meu retaguarda muda semanalmente, esse MD5 sempre vai mudar, como fica?

abraço!
Fernando.


em 9/4/2011 15:51 - Responder

 

[Comentário do autor]   Luis Carlos Godinho
Olá!

Todos os executáveis e DLL que compôem o projeto do PAF. Se o seu retaguarda fizer parte do PAF, acredito que deverá homologar. Ma entendo que o retaguarda não precisa fazer parte do PAF.
Este projeto é apenas um exemplo.

Abs!


em 9/4/2011 22:40 - Responder
 

William De Carvalho Brazilino
Bom dia Luiz, as DLLs não entram nesse relatório? abcs


em 6/5/2011 10:14 - Responder

 

[Comentário do autor]   Luis Carlos Godinho
Olá!

Entram sim, basta fazer a rotina adicionando a extenção .DLL.

Abs!


em 6/5/2011 13:30 - Responder
 

André Gustavo Belo Cavalcanti
Vc pode enviar a funcao md5print ??

Grato,
André
plansoft@gmail.com


em 24/6/2011 16:34 - Responder

 

[Comentário do autor]   Luis Carlos Godinho
Ola!

No proprio componente Acbr pode ser encontrada a unit.
De qualquer forma, segue o link:
http://www.koders.com/delphi/fid5A4F925F646C191A79107D11EDD80DDDF205615E.aspx

Abs!


em 24/6/2011 20:30 - Responder
 



[Este post ainda não foi associado a uma sequência]
Curso Online
Autor
Luis Carlos Godinho

Programador formado em 1995, pela ETEIT – Escola técnica da UNIVALE. Atualmente trabalhando com a plataforma Delphi. Tem se dedicado nos últimos anos, ao desenvolvimento de aplicações PAF-ECF, SPED fiscal e NFe.


Space do autor
Estatísticas #
Favorito:
Comentários:
Feedback:
Utilidade:
2   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível somente para quem possui Créditos DevMedia. (Ele não está associado a nenhuma publicação DevMedia).


  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03