Compartilhar via


Codificação de dados assinados

Os dados assinados consistem em conteúdo de qualquer tipo e hashes de mensagem criptografados do conteúdo por zero ou mais signatários. O hash resultante pode confirmar que a mensagem original não foi modificada desde a assinatura e que determinadas pessoas ou entidades assinaram os dados.

A ilustração a seguir ilustra o procedimento para codificar uma mensagem assinada. A lista que segue a ilustração descreve as etapas.

Uma mensagem pode ter vários signatários, algoritmos de hash e certificados. Embora a ilustração mostre apenas certificados, CRLs e CTLs podem usar o mesmo processo. Eles se encaixariam na ilustração onde quer que os certificados sejam mostrados.

codificando uma mensagem assinada

O processo geral para codificar dados assinados é o seguinte.

Para codificar dados assinados

  1. Os dados são criados (se necessário) e um ponteiro para ele é recuperado.
  2. Um repositório de certificados é aberto que contém o certificado do signatário.
  3. A chave privada do certificado é recuperada. Há duas propriedades que devem ser definidas no certificado antes de usá-lo. Um deles é usado para vincular um certificado a um CSP específico e, dentro desse CSP, a um contêiner de chave privada específico. O outro é usado para indicar qual algoritmo de hash deve ser usado quando uma operação de hash é chamada. Eles só precisam ser definidos uma vez.
  4. A propriedade de um certificado determina o algoritmo de hash.
  5. Um hash dos dados é criado enviando os dados por meio da função de hash.
  6. A assinatura é criada criptografando o hash usando a chave privada, obtida por meio de uma propriedade no certificado.
  7. Os seguintes dados estão incluídos na mensagem assinada concluída:
    • Os dados originais a serem assinados
    • Os algoritmos de hash
    • As assinaturas
    • As estruturas de informações do signatário, que incluem o identificador do signatário (emissor do certificado e número de série)
    • Certificados do signatário (opcional)

Este procedimento ilustra um caso simples. Casos mais complexos envolvem atributos autenticados incluídos na mensagem. Quando o tipo de conteúdo é tudo menos uma cadeia de caracteres BYTE ou há pelo menos um atributo autenticado junto com qualquer tipo de dados, há dois atributos autenticados padrão necessários: o tipo de conteúdo (dados) e o hash do conteúdo. Nessas circunstâncias, o CryptoAPI fornece automaticamente esses dois atributos necessários. As funções de mensagem de baixo nível hash dos atributos autenticados, criptografam o hash com a chave privada e fornecem isso como a assinatura.

Use as funções de mensagem de baixo nível para realizar as tarefas listadas apenas usando o procedimento a seguir.

Para codificar uma mensagem assinada

  1. Crie ou recupere o conteúdo.

  2. Obter um provedor criptográfico.

  3. Obtenha os certificados do signatário.

  4. Inicialize a estrutura de CMSG_SIGNER_ENCODE_INFO .

  5. Inicialize a estrutura de CMSG_SIGNED_ENCODE_INFO .

  6. Chame CryptMsgCalculateEncodedLength para obter o tamanho do BLOB de mensagem codificado. Alocar memória para ele.

  7. Chame CryptMsgOpenToEncode, passando CMSG_SIGNED para dwMsgType e um ponteiro para CMSG_SIGNED_ENCODE_INFO para pvMsgEncodeInfo obter um identificador para a mensagem aberta.

  8. Chame CryptMsgUpdate, passando o identificador recuperado na etapa 7 e um ponteiro para os dados que devem ser assinados e codificados. Essa função pode ser chamada quantas vezes forem necessárias para concluir o processo de codificação.

  9. Chame CryptMsgGetParam, passando o identificador recuperado na etapa 7 e os tipos de parâmetro apropriados para acessar os dados desejados e codificados. Por exemplo, passe CMSG_CONTENT_PARAM para obter um ponteiro para toda a mensagem PKCS nº 7 .

    Se o resultado dessa codificação for usado como os dados internos de outra mensagem codificada, como uma mensagem em envelope, o parâmetro CMSG_BARE_CONTENT_PARAM deverá ser passado. Para obter um exemplo mostrando isso, consulte Código alternativo para codificar uma mensagem enveloped.

  10. Feche a mensagem chamando CryptMsgClose.

O resultado desse procedimento é uma mensagem codificada que contém os dados originais, o hash criptografado desses dados (assinatura) e as informações do signatário. Há também um ponteiro para o BLOB codificado desejado.

Para obter detalhes de codificação C, consulte Exemplo de Programa C: Assinatura, Codificação, Decodificação e Verificação de uma Mensagem.