Página 2 de 2

SHA-1 e base64

Enviado: 22 Abr 2019 11:36
por depaula.jau
Bom dia a todos

Jairo! Qual o Portal para fazer o cadastro do Responsável tecnico ?

Como vcs estão discutindo sobre , imagino que ja tenha isso em algum lugar?

Eu procurei , procurei e não encontrei ainda nada a respeito.


Abrs.

SHA-1 e base64

Enviado: 22 Abr 2019 13:57
por Jairo Maia
depaula.jau, conforme a nova versão da NT 2018.005, no futuro será obrigatório para todas as UF´s. Na NT anterior falava em opção de cada UF adotar.

São Paulo declarou que não tem previsão SE ou QUANDO irá adotar o controle de responsável técnico. Trabalho com NF-e somente no estado de SP, e não tem como se cadastrar ainda em SP. No futuro (ainda não definido), e se nada mudar SP terá que adotar.

Já para quem tem emissão nos estados de AL, AM, MS, PE, PR, SC e TO está disponível nos sites de cada SEFAZ, e entra em produção em 07/05/2019.

SHA-1 e base64

Enviado: 22 Abr 2019 14:16
por JoséQuintas
Algumas UFs exigem o bloco, mas incompleto sem código ou se cadastrar.
Ou seja, nada desse cálculo doido.

SHA-1 e base64

Enviado: 22 Abr 2019 14:19
por JoséQuintas
Convém lembrar que tem outras alterações que vão entrar.
Em São Paulo não entra o bloco do desenvolvedor, mas entram outras, na semana que vém.

SHA-1 e base64

Enviado: 23 Mar 2023 15:46
por malcarli
Caro Jairo pegando carona no seu post
seria possivel com a sua rotina converter isso

"31000000OL03 00000000000120070103TNN00000000205000000000000050000002658100013167474254”
2º - Converta a cadeia de caracteres ASCII para bytes.
3º - Gere o HASH (array de bytes) utilizando SHA1.
4º - Assine o HASH (array de bytes) utilizando RSA-SHA1.
ATENÇÃO! Na maioria das linguagens de programação, os passos 3 e 4 são feitos através de uma única função. Verifique a documentação de sua linguagem para evitar assinar um hash de um hash.
Jairo Maia escreveu:Olá Pessoal,

Entre outras coisas, a versão 1.20 da NT 2018.005 também corrigiu o exemplo de como gerar a tag hashCSRT. Agora funciona exatamente como está no manual. Poderiam ter feito a coisa certa antes, pouparia muito tempo de muita gente:

NOTA: No exemplo da NT onde se lê: "resultando em uma string de 28 caracteres (20 bytes)", leia: "Só na cabeça do ENCAT 28 caracteres tem 20 bytes."
hashCSRT.jpg

Código: Selecionar todos

Function Main()

 Clear Screen

 cHash := "G8063VRTNDMO886SFNK5LDUDEI24XJ22YIPO"
 cChave := "41180678393592000146558900000006041028190697"

 /*
   Passo 1:  Concatenar o CSRT com a chave de acesso da NF-e/NFC-e
 */
 cHash := cHash + cChave
 ?
 ? "Resultado passo 1: cHash + cChave:", cHash

 /*
   Passo 2: Aplicar o algorítmo SHA1 resultando em uma string de 40 caracteres em Hexadecimal:
 */
 cHash := Hb_SHA1( cHash, .F. )  // se usar o segundo parâmetro como .T. (raw), elimine o passo 2A
 ?
 ? "Resultado passo 2 SHA1:", cHash

 /*
   Passo 2A: Passar Hexadecimal para String (usei assim apenas para entender o exemplo).
   Se usar no passo acima dessa forma: cHash := Hb_SHA1( cHash, .T. ), elimene essa etapa.
 */
 cHash := HexToStr( cHash )
 ?
 ? "Resultado passo 2A (Hex para Str):", cHash

 /*
   Passo 3: Passar o resultado anterior para Base 64, resultando numa string de 28 bytes:
 */
 cHash := hb_base64Encode( cHash, Len( cHash ) )
 cHash := StrTran( cHash, Hb_EOL() )  // sem quebra de linha (se der erro na validação, não use StrTran())
 ?
 ? "Resultado passo 3 (<hashCSRT> em Base 64):", cHash
 
 ?
 ? "Bingo: Agora o exemplo da NT esta certo..: aWv6LeEM4X6u4+qBI2OYZ8grigw="
 ?

Return Nil
Peguei este exemplo e tentei adaptar, mas não deu certo, é a tag assinatura da nfse de sp

Código: Selecionar todos

/*
https://pctoledo.org/forum/viewtopic.php?f=43&t=18664
*/

#define __TESTE__
#include "minigui.ch"
#define _CAPICOM_STORE_OPEN_READ_ONLY                 0           // Somente Smart Card em Modo de Leitura

#define _CAPICOM_MEMORY_STORE                         0
#define _CAPICOM_LOCAL_MACHINE_STORE                  1
#define _CAPICOM_CURRENT_USER_STORE                   2
#define _CAPICOM_ACTIVE_DIRECTORY_USER_STORE          3
#define _CAPICOM_SMART_CARD_USER_STORE                4

#define _CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED           2
#define _CAPICOM_CERTIFICATE_FIND_SHA1_HASH           0           // Retorna os Dados Criptografados com Hash SH1
#define _CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY   6
#define _CAPICOM_CERTIFICATE_FIND_TIME_VALID          9           // Retorna Certificados Válidos
#define _CAPICOM_CERTIFICATE_FIND_KEY_USAGE           12          // Retorna Certificados que contém dados.
#define _CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE          0x00000080  // Permitir o uso da Chave Privada para assinatura Digital
#define _CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME 0           // Este atributo contém o tempo em que a assinatura foi criada.
#define _CAPICOM_INFO_SUBJECT_SIMPLE_NAME             0           // Retorna o nome de exibição do certificado.
#define _CAPICOM_ENCODE_BASE64                        0           // Os dados são guardados como uma string base64-codificado.
#define _CAPICOM_E_CANCELLED                          -2138568446 // A operação foi cancelada pelo usuário.
#define _CERT_KEY_SPEC_PROP_ID                        6
#define _CAPICOM_CERT_INFO_ISSUER_EMAIL_NAME          0
#define _SIG_KEYINFO                                  2

#include "hbclass.ch"
#ifdef __TESTE__

PROCEDURE TesteCapicom
   LOCAL cTexto, cSignatureValue, cDigestValue, cPublicKey

   cTexto    := "37925504A    00000000102620230323TNN00000000000010000000000000000002919232877058000295"
   cResult:=[NRFumPrLb8GMxh/e0UXVh8aLq6Vim6s1kbOc5AFcOFl61TlhHG6PsTJgZA+HYz2WZ9nVExmbDPffavI0qjFyxE/PZkWCAWzPzXU2DRzFKGGTUSRm4fr/g66AJZX4Ok+W70rCx3wMMKO1R1s83TXQdpcexNxFDoxhBPpUy/wQfNGfmxKZsMTRkbCjd28Dz3kpOIWNxeuQ2Wc7CV0ko631/kz3ErRDZyig2qcKg3lkpanw27pgLaDAm10EHUrurR/fsmBDnhfzU63V4z1U8iYPsbXT2j6WP6DLdaxzIBdZfiu1+dPlrTlH51fC3Uve8/T5+dUh2MT9D/cwL4g1IxR8eg==]

    msginfo(GeraAssSHA1(ctexto) == cresult)

   RETURN
#endif


FUNCTION GeraAssSHA1(sAssinatura)
LOCAL cRET:=''
LOCAL cCHA:=sAssinatura
LOCAL aRetorno
LOCAL aBytes


oStoreMem := win_oleCreateObject( "CAPICOM.Store" )
oStoreMem:open(_CAPICOM_MEMORY_STORE,'Memoria',_CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
oStoreMem:Add( pegaObjetoCertificado()  )
DadosParaAssinar := CreateObject("CAPICOM.SignedData")

// Array de Bytes
aBytes := {}
FOR i:= 1 TO LEN(cCHA)
   AADD( aBytes, ALLTRIM( STR( ASC(SUBSTR( cCHA,i,1))-48 ) ) )
NEXT
// Array de Bytes

DadosParaAssinar:content := HB_SHA1( aBytes, .T. )


oSign := CreateObject("CAPICOM.Signer")
cCHA := DadosParaAssinar:Sign(oSign,.F.,0)
 
msginfo(hb_Base64Encode(ccha))
msginfo(hb_Base64DEcode(ccha))
RETURN(cCHA)

function pegaObjetoCertificado() 
LOCAL oStore, oCertificados, oResult := Nil, nI
Local cSerialCert    := upper([4b8db3b9d22a50b5])

        oStore := win_oleCreateObject( "CAPICOM.Store" )
  IF oStore=nIL
msginfo([erro])
     Return oResult
  ENDIF
     oStore:open(_CAPICOM_CURRENT_USER_STORE,'My',_CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
  IF oStore=nIL
 msginfo([erro 1])
    Return oResult
  ENDIF

  oCertificados:=oStore:Certificates()
  FOR nI=1 TO oCertificados:Count()

        IF oCertificados:Item(nI):SerialNumber == cSerialCert
            oResult := oCertificados:Item(nI)

           EXIT
        ENDIF
  NEXT
  oCertificados := Nil
  oStore := Nil
RETURN(oResult)