-
Total de ítens
8 -
Registro em
-
Última visita
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Posts postados por Eduardo Augusto
-
-
Em 13/05/2019 at 10:49, Daniel Simoes disse:
Creio que você possa usar o método abaixo:
function ValidarHash( const AStringList : TStringList; const Digest: TSSLDgst; const Hash: AnsiString; const Assinado: Boolean = False): Boolean; overload;
Exemplo:
if ValidarHash( StringOriginal, dgstSHA256, HashCalculado, True) then ShowMessage('Hash OK');
Olá, Daniel.
Não obtive êxito nos testes.
A linha << If ValidarHash(StrOriginal, dgstSHA256, HashCalculado, True) then >> está acusando o seguinte erro "F2066 MIssing operator or semicolon".
Na tentativa de encontrar uma solução, tentei usar a analogia com o método CalcHash e alterei a chamada da função ValidarHash com a inclusão de FACBrDFe.SSL.ValidarHash.
FACBrDFe := TACBrDFe.Create(Application); FACBrDFe.Configuracoes.Geral.SSLLib:= libWinCrypt; FACBrDFe.Configuracoes.Certificados.NumeroSerie := '0a520aadce0d6002a3f4bab8d983568a'; If not FACBrDFe.SSL.ValidarHash(StrOriginal, dgstSHA256, HashCalculado, True) then showmessage('Ainda não estoui no caminho certo...') ; if FACBrDFe.SSL.ValidarHash(StrOriginal, dgstSHA256, HashCalculado, True) then showmessage('Deu Certo!!!! Yuuupiiii!!!!');
O código não acusou nenhum erro, mas como ainda não entendi muito bem qual deve ser o conteúdo das constantes StrOriginal e HashCalculado, só obtive o resultado "Ainda não estou no caminho certo...".
Por favor, corrijam-me se eu estiver enganado:
Com a função FACBrDFe.SSL.CalcHash, direcionada ao meu certificado digital A1, eu transformo uma hash composta de bytes na AssinaturaDig :
- INPUT/HashBytes: 3132303830383343333030303030303436303132414131393925374333303030303030343630313241413030303030303030303030303030303030302537433530333536323836303030313130253743542e642e4e2e642e432e253743323031393035313031363030303030253743333136382537433925374336313625374331363725374332313725374330363325374331353225374335323833
- OUTPUT/AssinaturaDig: ogp3uJQ6oFsdo4sckxQayHGyO+NeBCkamqDfDS3fMDDPChiagxzlbwHPdNMfl7Xa8ZTSZk6/7Rw3SUptBgrO4NkQoQ5LUUDQLvOuGgS0+nUoWqq6QllVC/xYZbX+/qGUZ51CL5vLVBvOdCOMIircuMAlPlThxANEkmpE7T5rODjpFnUhWo1aDFoXJDuc7mbgkoyaKDsV81fMc38q6X9ZWZZmBdrbj5ahafN+iLFWJGsTbc7PHyPI5CGwGdQ+JqGWp2FlLbc3zCTkz3I+KFXs3Rac1fVMOcQz54wj17fLAyPAO02yHDO8+qfEvz6WQk/F165TLCPRHZVeaaip1YKMAA==
Eu estou deduzindo que a função ValidarHash serve para comparar as duas strings, a de entrada (Hashbytes) com o resultado (AssinaturaDig).
Ou seja, nos teste que estou fazendo (e falhando) eu estou atribuindo os seguintes valores às constantes da função ValidarHash:
- StrOriginal: o valor da HashBytes: 313230383038334333303030303...
- HashCalculado: o valor da AssinaturaDig: ogp3uJQ6oFsdo4sckxQayHGyO+...
Estaria eu equivocado nesse raciocínio?
E quanto ao erro que o código está acusando e ao meu abuso de alterar sua grafia?
Mais uma vez agradeço pela paciência de todos.
EA
-
Valeu, Daniel.
Vou testar o código e, assim que possível, eu retornarei com o resultado.
EA
- 1
-
Obrigado, Daniel, por sua sempre pronta participação.
Estou meio confuso com esse assunto.
Eis o conteúdo da norma que devo cumprir:
CitarO Termo de Abertura, assinado criptograficamente pelo TJSP, conterá:
- O identificador da Serventia;
- Data/hora; e
- Função de hash: SHA256.
O hash do Termo de Abertura deverá ser armazenado como um registro da mesma forma que os registros correspondentes aos atos emitidos pela Serventia.
Exemplo inicial de Termo de Abertura:Citar0000000TA123456061021037F|1SHA256RSA|0|0|201807131810210|0|0|0|0|0|0|0|0|0|Tduw3GPaJkw5bLuwAMmlvQ3fVrwwUuRwxcMVmApxUhVSERlybOhmhzt4GMvMC/UvLVwNCIh+9ª7md2wH3nDXhtlGIamzcZcXTD50H67TD4/HFxk9y7Lvaze+qIU4apdzrPHDtft7mw2AdeSvai+3Vxhe0x231rIk9CXSgxUhc5qA3Fj/eamGcuUU8GyGi6IBJjln1hJqsg8w//XiMMlvkW8gdKzAo+N51osZ2NeK6qxBXEXA25MSsQ59Eaab29Xtp+Z
De posse do registro de abertura, a Serventia:- Passo 1: Calcula o hash usando a função de hash especificada no termo de abertura;
- Passo 2: Descriptografa o hash do registro de abertura usando a chave pública do TJ;
- Passo 3: Compara com o hash calculado no passo 1 com o hash obtido no passo 2.
Segue anexa a imagem que ilustra essa operação.
O que eu preciso é dos comandos que cumpram os 3 passos acima.
Você poderia me auxiliar?
Obrigado.
EA
-
Prezados amigos:
Tenho a seguinte situação:
Hash original:
- 1208083C300000046012AA199|300000046012AA000000000000000000|50356286000110|T.d.N.d.C.|201905101600000|3168|9|616|167|217|063|152|5283
Hash em Bytes (variável HashBytes) após parametrização RFC 3986 – UTF-8 (URL Encoding):
- 3132303830383343333030303030303436303132414131393925374333303030303030343630313241413030303030303030303030303030303030302537433530333536323836303030313130253743542e642e4e2e642e432e253743323031393035313031363030303030253743333136382537433925374336313625374331363725374332313725374330363325374331353225374335323833
Meu sistema VBA envia essa HashBytes para o aplicativo Delphi por intermédio do seguinte comando (via prompt do cmd.exe):
- Shell "AssinadorDelphi.exe --x-- " & HashBytes
O AssinadorDelphi.exe (que consegui elaborar graças ao inestimável apoio deste maravilhoso fórum), utilizando a minha chave privada (A3 ou A1), assina essa HashBytes em SHA256. Seguem as principais linhas do código (que estão funcionando perfeitamente):
Citarvar HashBytes : pchar;
//
HashBytes := Pos(' --x-- ', getcommandline); // ' --x-- ' => identificador inequívoco do início da HashBytes
//
FACBrDFe := TACBrDFe.Create(Application);
FACBrDFe.Configuracoes.Geral.SSLLib:= libWinCrypt;
FACBrDFe.Configuracoes.Certificados.NumeroSerie := '020ad6002a3f0a5ad68b8dce4ab8953a';
FACBrDFe.Configuracoes.Certificados.Senha := 'senha_secreta';
AssinaturaDig := FACBrDFe.SSL.CalcHash(HashBytes, dgstSHA256, outBase64, True);
FACBrDFe.Free;
// mesmo funcionando aparentemente de forma perfeita, aceito críticas e sugestões para melhorar este código.
Resultado obtido pelo AssinadorDelphi.exe para a variável AssinaturaDig:
- ogp3uJQ6oFsdo4sckxQayHGyO+NeBCkamqDfDS3fMDDPChiagxzlbwHPdNMfl7Xa8ZTSZk6/7Rw3SUptBgrO4NkQoQ5LUUDQLvOuGgS0+nUoWqq6QllVC/xYZbX+/qGUZ51CL5vLVBvOdCOMIircuMAlPlThxANEkmpE7T5rODjpFnUhWo1aDFoXJDuc7mbgkoyaKDsV81fMc38q6X9ZWZZmBdrbj5ahafN+iLFWJGsTbc7PHyPI5CGwGdQ+JqGWp2FlLbc3zCTkz3I+KFXs3Rac1fVMOcQz54wj17fLAyPAO02yHDO8+qfEvz6WQk/F165TLCPRHZVeaaip1YKMAA==
Até aí, tudo perfeito!
O que eu preciso agora é o seguinte:
- uma outra Unit que faça exatamente o inverso, ou seja, de posse dessa AssinaturaDig, preciso obter a HashBytes que a originou, com a utilização da chave pública do emitente, para que o sistema confira a sua integridade.
Ao que me parece, basta substituir umas duas linhas do código.
As pesquisas que fiz neste Fórum e em toda a internet só me retornaram exemplos de "validação de arquivos xml" (obviamente por ser esse o principal uso dos participantes deste fórum). No entanto, para a minha necessidade, o aplicativo terá que conferir a assinatura digital que receberei no formato acima especificado.
Peço a compreensão e paciência de todos, pois não atuo na área de programação (nem sou da área de Exatas) e só soube que Delphi era uma linguagem de programação há pouco mais de 2 meses, quando aqui encontrei a solução acima descrita e que já coloquei em funcionamento. Ou seja, por mais que eu queira encontrar a solução sem atazanar a vida de ninguém, sou obrigado a admitir que não tenho condições técnicas para, no exíguo tempo que me resta para terminar a nova rotina, obter sozinho essa resposta mediante a análise das inúmeras de linhas de código de todas as fontes gentilmente disponibilizadas pela ACBr.
Ficarei feliz diante de qualquer colaboração.
Muito obrigado.
EA
-
Prezados amigos:
Com base nas valiosas colaborações do Daniel (neste tópico) e do Kym (msg privada), consegui elaborar em Delphi a rotina para a assinatura digital da hash.
A solução só não ficou perfeita pelo fato de eu não ter obtido sucesso em usar uma DLL Delphi no VBA, mas driblei o problema criando em Delphi a mesma rotina como um arquivo executável, que salva a assinatura digital em um arquivo txt , deixando ao VBA a simples missão de, poucos segundos depois de ter "provocado" a execução dessa rotina, ler automaticamente o txt por ela gerado em busca da desejada informação.
Portanto, Questão Solucionada!
Muito obrigado.
EA
- 3
- 1
-
21 horas atrás, Daniel Simoes disse:
A ideia é obter a Chave Privada de um Certificado, e usar a mesma para efetuar a criptografia do Hash Gerado...
Você pode ver o código do ACBr, onde isso é efetuado com a Wincrypt, no método "TDFeWinCrypt.CalcHash" do fonte: ACBrDFeWinCrypt.pas
Muito obrigado, Daniel.
Vou, então, tentar decifrar o código por vc indicado para depois decidir se convém adaptá-lo para o VB ou se a melhor saída será aventurar-me na linguagem Delphi para poder utilizar essa função já pronta.
Por favor, corrija-me se eu estiver enganado. O arquivo "ACBrDFeWinCrypt.pas" é o condigo ainda não compilado. Caso eu opte por fazer uma rotina em Delphi para utilizar esse componente, a qual arquivo deverei fazer referência? Qual a extensão (e o nome, se diverso) do arquivo pronto "utilizável" resultante desse arquivo ".pas"?
EA
22 horas atrás, Cleber disse:Você precisa desse hash para qual finalidade?
NF-e, CT-e, etc...
Olá, Cleber.
Conexão com um sistema específico do Tribunal de Justiça.
EA
-
Prezados amigos:
Estou com uma enorme dificuldade para entender a lógica existente em uma "assinatura digital de hash" e, após muita pesquisa (muita mesmo), apenas neste Fórum senti a possibilidade de encontrar uma elucidação.
Esclareço que eu não sou programador (longe disso), mas mexo com computador desde 1986 e desenvolvi um sistema em VBA-Access que funciona perfeitamente há quase 15 anos. Mas, uma recente modificação na legislação está me levando à loucura, pois, após implementar praticamente tudo, emperrei na parte final, que é a comunicação "on line" com certificação digital.
Sei como assinar um arquivo qualquer com certificado A1 ou A3 e também já descobri como converter qualquer conjunto de caracteres (uma linha de texto, por exemplo) em bytes para, em seguida, obter uma hash SHA256. No entanto, não tenho a mínima ideia de como assinar uma simples linha de texto no padrão SHA256 para obter um string denominada "assinatura digital" a ser inserida no final dessa mesma linha de texto.
Vejam a regra constante das normas:
Geração do Hash Assinado
- O conteúdo de cada campo deverá ser formatado como determinado em anexo e concatenados com o caractere “|”.
Exemplo:1234561AB123456789012318I|CIACIACIACIACIACIACIACIACIACIACI|12345678901234|I.N.I.C.I.A.I.S.|201806281631426|620|80|50|50|50|50|50|50|1000|ASSINATURA
- Do resultado da concatenação devem ser obtidos os bytes conforme a codificação UTF8.
- Um hash será gerado a partir dos bytes resultantes da operação anterior.
- O hash deverá ser assinado usando a chave privada da Serventia.
- O hash assinado é adicionado ao final do registro.
Exemplo:1234561AB123456789012318I|CIACIACIACIACIACIACIACIACIACIACI|12345678901234|I.N.I.C.I.A.I.S.|201806281631426|620|80|50|50|50|50|50|50|1000|n829XD4stswH7ZNx54rzOWuGYBeqw6BdtiBOaxizpkpkp3VLHTkmEKOWkXrHVeISo76RPM6SxOTZBfxkmu/kQMn8V1D99ePB4S6CQh9rH6T5vmj1oj82ObTe8IiwO03qpoxwzOfER70tlvn4HwCi0ekNvgsvGpXekiCzweO473yeLHQutxl4Pv4FHZYaZYsWDcr3zdDT01nBzfj3xg7LveOlaJdeAkdzsppOvdYzHwTSR+mgNgtWJAM2Tae6uHRq1ZcB63z0T4lw9uopWOqOwdAbu4ByKuedGyZFc2FMkC5V0N3RrapI5XjH3fQRNmOeFvZvK7qAEPruw2lNXhX/Nw==
Meu sistema em VBA gera a string com todas as informações necessárias com o pipe (1), faz a conversão para a codificação UTF-8 (2) e a geração dos bytes resultantes da codificação UTF-8 (3), conforme abaixo exemplificado:
- 1234561AB123456789012318I|CIACIACIACIACIACIACIACIACIACIACI|12345678901234|I.N.I.C.I.A.I.S.|201806281631426|620|1000
- 1234561AB123456789012318I%7CCIACIACIACIACIACIACIACIACIACIACI%7C12345678901234%7CI.N.I.C.I.A.I.S.%7C201806281631426%7C620%7C1000
- 3132333435363141423132333435363738393031323331384925374343494143494143494143494143494143494143494143494143494143494143492537433132333435363738393031323334253743492e4e2e492e432e492e412e492e532e25374332303138303632383136333134323625374336323025374331303030
Falta, agora, implementar o seguinte item: "o hash deverá ser assinado usando a chave privada", mas eu não tenho a mínima ideia de como isso pode ser feito. O máximo que consegui foi transformar essa cadeia de bytes em SHA256, mas sem a utilização do certificado digital A1.
- 63ab9fa2e45ff9c9cae1c68e392f124c103afdccd3a7f9fdd550e3f244906af1
Estou tentando implementar isso em VBA (talvez, eu tenha que apelar para a elaboração de uma dll em VB ou C#, linguagens que ainda mal sei soletrar).
No entanto, sem compreender a lógica por trás dessa "assinatura digital de hash", fica impossível seguir adiante.
Alguém poderia me ajudar?
Obrigado a todos.
Eduardo Augusto
Validar Assinatura Digital em forma de String
em Dúvidas Gerais sobre o ACBr
Postado
Olá, colegas.
Perdoem-me pela insistência, mas será que alguém poderia me ajudar neste caso que postei no dia 14 de maio?
Continuo perdido quanto à utilização da função ValidarHash:
ValidarHash (StringOriginal, dgstSHA256, HashCalculado, True)
Obrigado.
EA