Ir para conteúdo
  • Cadastre-se

Eduardo Augusto

Membros
  • Total de ítens

    8
  • Registro em

  • Última visita

Posts postados por Eduardo Augusto

  1. 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/AssinaturaDigogp3uJQ6oFsdo4sckxQayHGyO+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 AssinaturaDigogp3uJQ6oFsdo4sckxQayHGyO+...

    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

     

     

     

     

     

  2. Obrigado, Daniel, por sua sempre pronta participação.

    Estou meio confuso com esse assunto.

    Eis o conteúdo da norma que devo cumprir:

    Citar

    O 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: 

    Citar

    0000000TA123456061021037F|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

     

     

     

     

     

     

    CA22B764-8BFF-464B-8A57-43C71FD49980.jpeg

  3. 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):  

    Citar

                        var 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

  4. 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

     

    • Curtir 3
    • Obrigado 1
  5. 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

  6. 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

    1. 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

    1. Do resultado da concatenação devem ser obtidos os bytes conforme a codificação UTF8.
    2. Um hash será gerado a partir dos bytes resultantes da operação anterior.
    3. O hash deverá ser assinado usando a chave privada da Serventia.
    4. 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:

    1. 1234561AB123456789012318I|CIACIACIACIACIACIACIACIACIACIACI|12345678901234|I.N.I.C.I.A.I.S.|201806281631426|620|1000
    2. 1234561AB123456789012318I%7CCIACIACIACIACIACIACIACIACIACIACI%7C12345678901234%7CI.N.I.C.I.A.I.S.%7C201806281631426%7C620%7C1000
    3. 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.

    1. 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

×
×
  • 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.