Ir para conteúdo
  • Cadastre-se

dev botao

Validar DigestValue


fmaia
  • Este tópico foi criado há 2589 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá Adislonpazzini,

Como eu vou assinar o XML que estou recebendo "recebido de terceiros"?

Eu quero saber como é feito o calculo do DigVal para comparar.

Ex.:

Se eu recebo um XML de terceiro está assinado tudo certinho, mais como eu vou saber se terceiro não modificou o XML e alterou algum valor ou quantidade de produtos etc..

Se eu calcular o DigestValue do XML recebido vou identificar que o XML foi modificado ou não.

Minha pergunta é como se faz esse cálculo do DigestValue e se o cálculo é somente entre os tags e ou o XML inteiro.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

bochnia, o que os colegas estão dizendo é o seguinte. Vc abre o XML recebido do teu fornecedor e vai conferir as

tags com a tag que está logo abaixo no mesmo XML dentro da tag

Ou seja a ta DigestValue é a que foi calculada e enviada para a SEFAZ, quando a SEFAZ enviou o protocolo de autorização ele é acrescentado no XML de origem. Logo a verificação está sendo DigestValue (parte do XML) com a digVal (parte do protocolo de autorização) mas tudo isto está dentro do arquivo XML.

(...)

8kpUFAIivgybhFlt9iMdqoOwcxE=

(...)

2

PR-v2_5_3

00000000000000000000000000000000000000000000

2012-02-01T14:07:03

1111111111111111

8kpUFAIivgybhFlt9iMdqoOwcxE=

100

Autorizado o uso da NF-e

(...)


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

Link para o comentário
Compartilhar em outros sites

é ainda pode haver fraudes. porem , se vc for no site do sefaz , e consultar a nf-e , la tem o DigestValue correto da NF-e .

Tipo , o que o cara pode fazer é pegar o DigestValue valido e abrir o arquivo e copiar o mesmo valor para o digVal do protnfe . Acho q realmente a unica forma de validar mesmo o xml do fornecedor é vendo no sefaz , todos os dados ..

Complicado .

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Então eu te pergunto!

Seu pegar o XML que foi enviado para a secretaria com uma quantidade de 10 peças no item e no XML que eu estou recebendo está com uma quantidade de 1000 peças.

Olhando só o DigVal não vou saber que esse XML está alterado não é?

Neste caso não saberá. Ai teria que fazer a conferência desta assinatura. Existem programas que fazem isto se vc procurar na internet possivelmente vai achar, mas para "Delphi" não sei se tem e para a linguagem que eu uso "Visual Objects" até consigo ler as tags xml, mas os componentes são muito limitados.

Tem como você testar esta opção:

Eu estou usando o ACBrNFeMonitor, então vou te passar os passos por ele, se você usa o componente aproveite a idéia e veja como é possível configurar nele a seguinte situação:

-----------------------------------------------------------------

Pego a chave de terceiros, como exemplo vou usar esta nota emitida em homologação:

17111236991917000142550010000002211000002216

Como os dois primeiros dígitos representam a UF eu sei que 17 é igual a TO

Mudo no ACBrNFeMonitor.ini UF=PR mudo para UF=TO

Envio para o Monitor o arquivo ENTNFE.TXT com o comando NFE.LerIni()

ENTNFE.TXT //(arquivo)

NFE.LerIni() //Com este conteúdo.

Sobre o NFe.LerIni

NFe.LerIni - Le as informações do arquivo ACBrNFeMonitor.ini. Útil para quem muda as configurações do INI por fora da interface do ACBrNFeMonitor e quer que as configurações sejam lidas sem precisar fechar e abrir novamente o programa.

O ACBrNFeMonitor é setado para as novas configurações. Neste caso só troquei a UF

UF=TO //Sei que é TO pelo 17 que inicia a chave.

Mando agora para o Monitor o arquivo ENTNFE.TXT com o seguinte conteúdo

ENTNFE.TXT (arquivo)

NFE.ConsultarNFe("17111236991917000142550010000002211000002216") //Conteúdo

Observe que só vai a chave e não o arquivo XML, apenas a chave.

Recebo no SAINFE.TXT este retorno.

OK: Autorizado o uso da NF-e

[CONSULTA]

Versao=SVRS20110429163610

TpAmb=2

VerAplic=SVRS20110429163610

CStat=100

XMotivo=Autorizado o uso da NF-e

CUF=17

ChNFe=17111236991917000142550010000002211000002216

DhRecbto=28/12/2011 17:27:18

NProt=317110000042598

DigVal=QJiRV9Cy7Ude5rVOMZh2/zEi+vU=

Pego o DigVal e confiro com o DigestValue do XML. Se não for igual então o XML sofreu alteração.

-----------------------------------------------------------------------


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

Link para o comentário
Compartilhar em outros sites

Olá Kiko Fernandes, obrigado por você se esforçar em responder esse fórum.

O problema que é facilmente editado um XML e alterado qualquer campo da NFe, e essa modificação não reflete no DigVal.

Ex.: Você me envia um XML eu altero a quantidade de um item na NFe e lhe devolvo o XML e você vera que todos os dados na NFe estão corretos, DigVal, Assinatura, Certificado, mais esse XML não é mais valido, pois foi modificado, e fazendo somente esse tipo de comparação do DigVal do XML e o que está na secretaria não vai identificar a mudança no XML.

Então quero saber como validar o XML para detectar se foi modificado.

Obrigado.

Link para o comentário
Compartilhar em outros sites

Soh validando a assinatura mesmo... Mas eu pergunto: o emissor tem o dever de mandar o xml assinado (e autorizado) para o seu cliente. Se o xml foi alterado pelo emissor, problema não é do cliente, e sim do emissor que está fraudando um documento fiscal... As notas de entrada do cliente terão de ser de acordo com o xml enviado pelo emissor, e não de acordo com o que está no banco de dados da sefaz... Se o xml recebido pelo cliente nao confere com o que está na sefaz, o problema é do emissor, e nesse caso o cliente não é cumplice. Ele deve aceitar a mercadoria de acordo com o DANFE emitido, e fazer registro fiscal de acordo com o XML recebido.

Agora, se eu nem mesmo confio no meu fornecedor, pq vou comprar dele?

Mas se vc REALMENTE quer validar os xmls recebidos... tem que ser pela assinatura, ou entao, se ficar muito complicado pra vc, eis uma dica: o Acbr tem um projeto funcional chamado RecuperaXML, onde vc insere a chave de acesso do XML e digita o captcha recebendo as informacoes que existem na SEFAZ. Com isso vc compara o que tá na sefaz, com o que vc tem em mãos. É uma alternativa.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Acabei de enviar ao SVN uma alteração que permite validar a assinatura de um XML.

Veja no demo o botão "Validar Assinatura". Por enquanto esta função só funciona na versão CAPICOM.

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link para o comentário
Compartilhar em outros sites

Olá André, é exatamente isso que eu estava falando.

Fiz dezenas de testes em notas fiscais que eu emiti 100% correto, efetuei teste modificando qualquer valor no XML é a rotina retorna informando que o XML não é mais valido.

Mas ocorrem problemas em XML de terceiros, em cerca de 90% dos testes a rotina falha, teve casos que funcionou corretamente, efetuei os testes também utilizando a pagina da secretar ia-RS e retorna OK, mas a rotina retorna como XML inválido.

Abraços

Ricardo

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Poste um XML que é validado pelo Sefaz-RS e não é validado pelo componente para que possamos testar a rotina.

djsystem-logo.png
 youtube.png facebook.png instagram.png linkedin.png
André Ferreira de Moraes | Analista de Sistemas
www.djsystem.com.br | www.djpdv.com.br
www.tefhouse.com.br | www.lambretinha.com.br
Link para o comentário
Compartilhar em outros sites

<?xml version="1.0" encoding="UTF-8"?>3531401596Ret merc remetida deposito fechado ou armazem1551323092011-09-062011-09-0600:00:00135225051161101.002426290000599BIOMEDICAL DISTRIBUTION MERCOSUR LTDABIOMEDICAL DISTRIBUTION MERCOSUR LTDAAV PORTUGAL1100PARTE C-1ITAQUI3522505ITAPEVISP066960601058BRASIL1147748033373112957119ISENTO5211701300142916000186CNPH COMERCIAL NACIONAL PROD.HOSP. LTDARUA GAMA CERQUEIRA,331CAMBUCI3550308Sao PauloSP015390101058Brasil1133899339114089310112lidiane.silva@bomibrasil.com.br;[email protected] STAT CARTUCHO CHEM8+ 25 CART999999995906un17.0000343.18005834.06un17.0000343.1800104000000000000000999530.000.000.000.00080801.020.01000000000000000100968 - STAT CARTUCHO CG8+382200905906un5.0000244.18001220.90un5.0000244.1800104000000000000000999530.000.000.000.00080801.020.01000000000000000100968 - STAT CARTUCHO CG8+382200905906un40.0000244.18009767.20un40.0000244.1800104000000000000000999530.000.000.000.00080801.020.03000000000000000100819-STAT CARTUC CG4 7G02-02382200905906un41.0000224.15009190.15un41.0000224.1500104000000000000000999530.000.000.000.00080801.020.03000000000000000100819-STAT CARTUC CG4 7G02-02382200905906un14.0000224.15003138.10un14.0000224.1500104000000000000000999530.000.000.000.0008080.000.000.000.0029150.410.000.000.000.000.000.000.000.0029150.4100.800100000.170IPI - Nao Inc. Conf Art. 42, Inc III do RIPI ICMS - Isento Conf. Art. 7, I do RICMS/SP IPI - Nao Inc. Conf Art. 42, Inc III do RIPI Ref. NF venda C032309; Devolucao de notas (s): P = 01.020.030, NF 16644;4FHuMLMuUo4gIKuSfv2Xn9vZ1OI=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_NFE_PL_006j351109024262900005995500100003230913140159662011-09-06T08:40:461351104658736674FHuMLMuUo4gIKuSfv2Xn9vZ1OI=100Autorizado o uso da NF-e

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois ...

Já descobri o problema mas ainda não tive tempo de corrigir.

Olá, anfm, qual é o problema? estou pendente com isto na empresa, eu poderia ajudar nessa correção.

Já tentei várias coisas, até passei a manhã hoje atualizando o windows para desencargo de consciência...

- Sou desenvolvedor.

- De que linguagem, delphi? .NET? Java?

- Qualquer uma, sou desenvolvedor.

Link para o comentário
Compartilhar em outros sites

Olá,

estou com o mesmo problema que o markapollo. Anfm, você poderia dar uma estimativa de quando solucionará este problema?

E se for demorar muito, devido à falta de tempo ou por ser uma modificação muito trabalhosa, você poderia dar uma dica de como resolvermos este problema?

Grato

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...

Olá,

descobri qual o problema da validação de assinatura. O problema é que no parâmetro da função ValidaAssinatura (NotaUtil.ValidaAssinatura) estava sendo passado a property XML da classe NotaFiscal, e o read dessa property (a function GetNFeXML) gera um novo XML a partir das properties da classe NFe. E ao gerar o XML pela function GetNFeXML algumas propriedades são alteradas:

1. Os atributos versao e ID da tag InfNFe são invertidos de ordem;

2. As tags que possuem casas decimais variáveis (por exemplo, 0-10) estão sendo fixadas com o tamanho máximo;

3. Alguns caracteres de quebra de linha estão sendo removidos.

Para corrigir o problema, passei como parâmetro da função NotaUtil.ValidaAssinatura o ArquiloXML lido do arquivo e não alterado. As alterações foram:

1. Criei a property XMLInalterado na classe NotaFiscal da Unit ACBrNFeNotasFiscais:

NotaFiscal = class(TCollectionItem)

private

FNFe: TNFe;

FXML: AnsiString;

FXMLInalterado: AnsiString;

.

.

property XML: AnsiString read GetNFeXML write FXML;

property XMLInalterado: AnsiString read FXMLInalterado write FXMLInalterado;

2. A function LoadFromFile da Unit ACBrNFeNotasFiscais ficou assim:

function TNotasFiscais.LoadFromFile(CaminhoArquivo: string): boolean;

var

LocNFeR : TNFeR;

ArquivoXML: TStringList;

XML : AnsiString;

XMLInalterado : AnsiString;

begin

try

ArquivoXML := TStringList.Create;

ArquivoXML.LoadFromFile(CaminhoArquivo);

XMLInalterado := ArquivoXML.Text;

Result := True;

while pos('',ArquivoXML.Text) > 0 do

begin

if pos('',ArquivoXML.Text) > 0 then

begin

XML := copy(ArquivoXML.Text,1,pos('',ArquivoXML.Text)+5);

ArquivoXML.Text := Trim(copy(ArquivoXML.Text,pos('',ArquivoXML.Text)+10,length(ArquivoXML.Text)));

end

else

begin

XML := copy(ArquivoXML.Text,1,pos('',ArquivoXML.Text)+5);

ArquivoXML.Text := Trim(copy(ArquivoXML.Text,pos('',ArquivoXML.Text)+6,length(ArquivoXML.Text)));

end;

LocNFeR := TNFeR.Create(Self.Add.NFe);

try

LocNFeR.Leitor.Arquivo := XML;

LocNFeR.LerXml;

Items[self.Count-1].XML := LocNFeR.Leitor.Arquivo;

Items[self.Count-1].XMLInalterado := XMLInalterado;

Items[self.Count-1].NomeArq := CaminhoArquivo;

GerarNFe;

finally

LocNFeR.Free;

end;

end;

ArquivoXML.Free;

except

raise;

Result := False;

end;

end;

3. A function ValidaAssinatura da Unit ACBrNFeNotasFiscais ficou assim:

function TNotasFiscais.ValidaAssinatura(out Msg : String) : Boolean;

var

i: Integer;

FMsg : AnsiString;

begin

for i:= 0 to Self.Count-1 do

begin

if not(NotaUtil.ValidaAssinatura(('')+ ''), FMsg)) then

begin

Result := False;

Msg := 'Falha na validação da assinatura da nota '+

IntToStr(Self.Items.NFe.Ide.nNF)+sLineBreak+FMsg

end

else

Result := True;

end;

end;

Se eu cometi algum equívoco por favor me avisem.

Link para o comentário
Compartilhar em outros sites

Fiz as modificações conforme você descreveu e fiz dezenas de testes, em todas as notas foi confirmada a validade, fiz modificação no arquivo modifiquei, troquei algum caractere no arquivo XML e a rotina detectou a violação do arquivo XML.

Funcionou perfeitamente.

Se possível implementar no SVN

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2589 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.