Ir para conteúdo
  • Cadastre-se

dev botao

Assinatura Digital de uma hash


Ver Solução Respondido por Eduardo Augusto,
  • Este tópico foi criado há 1793 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

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

Link para o comentário
Compartilhar em outros sites

  • Moderadores
3 horas atrás, Eduardo Augusto disse:

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

Você precisa desse hash para qual finalidade?

 

NF-e, CT-e, etc...

Cleber C. Ferreira
Analista de Sistemas e Consultor
Email e
Skype: [email protected]
Formiga-MG

Link para o comentário
Compartilhar em outros sites

  • Fundadores

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

 

  • Curtir 1
  • Obrigado 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Fundadores

É um pouco mais complicado... essa Unit foi criada para ser usada internamente por TDFeSSL... Seria necessário instanciar essa classe manualmente...

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Solution

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
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1793 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.