Criptografia em AdvPL – Parte 13

Introdução

No post anterior (Criptografia em AdvPL – Parte 12), vimos um pouco mais sobre os certificados digitais, e as funções do AdvPL de manipulação / conversão de certificados e chaves. Agora,  finalmente, vamos assinar alguma coisa e ver como isso funciona ! Para ver tudo o que já foi publicado nessa série de posts, acesse o link Criptografia e Segurança.

Assinar digitalmente

Como vimos anteriormente de forma conceitual, a mecânica da criptografia assimétrica, baseada no par de chaves privada/pública, permite somente a quem tem a chave privada codificar um conteúdo, e qualquer um que tenha a chave púbica compatível — gerada a partir daquela chave privada — consegue decodificar um conteúdo.

O objetivo principal da assinatura digital não é codificar o conteúdo em si, mas sim gerar uma informação adicional baseada neste conteúdo, que chamamos de “assinatura”, e um terceiro que receber este conteúdo e a assinatura correspondente, possa afirmar que a assinatura foi feita realmente pela entidade em questão, e que o conteúdo que acompanha a assinatura não foi alterado.

Essa é a funcionalidade básica, mas existem mais variações e extensões, que veremos ao longo dos próximos exemplos.

Primeiro exemplo prático entre duas aplicações

Imaginem que eu desenvolvi hipoteticamente um mecanismo de distribuição de documentos, imagens , qualquer coisa, onde meus clientes precisam ter certeza que fui “eu mesmo” que gerei o documento para eles, e que esse documento não foi violado ou alterado por nenhuma etapa até ele chegar aos meus clientes. O conteúdo do documento em si não é sigiloso, eu não preciso codificar o documento.

Eu tenho uma chave privada, de minha criação e propriedade. Com ela eu sou capaz de codificar informações. Meus clientes vão receber de mim a minha chave púbica, assim eles serão capazes de decodificar qualquer coisa que eu tenha codificado com a minha chave privada. Porém, eu não preciso codificar o documento que eu estou enviando.

O que deve ser feito é calcular um HASH criptográfico do documento que eu estou assinando, usando algum algoritmo suportado — MD5, SHA1, SHA256  — e gerar uma assinatura desse HASH usando a minha chave privada. Então eu envio para os meus clientes a minha chave pública, a imagem e a assinatura que eu gerei, e o cliente tem como verificar se a assinatura enviada bate com o documento, recalculando ele mesmo o HASH do documento que eu mandei, e validando a assinatura enviada com a chave pública.

Assinando um arquivo qualquer em AdvPL

Para exemplificar o mecanismo de assinatura, o programa abaixo pega uma imagem da minha máquina, calcula o SHA1 dessa imagem, e gera uma assinatura usando a minha chave privada.

User Function MYSign()

Local cImageFile := "\imagens\padlock.png"
Local cSignInfo := "\imagens\padlock.sign"
Local cStrImage := ''
Local cHash := ''
Local cSignature := ""
Local nH, nTam
Local cError

// Lê o conteudo da imagem do disco 
nH := fopen(cImageFile)
nTam := fSeek(nH,0,2)
fSeek(nh,0)
fRead(nH,cStrImage,nTam)
fclose(nH)

// Calcula o SHA1 da imagem em formato binário
cHash := SHA1( cStrImage , 1 )

// Gera uma assinatura desse HASH usando a minha chave privada
cSignature := PrivSignRSA( "\siga0984\note-juliow-ssd.key", cHash, 2, "" , @cError )

IF !empty(cError)
  varinfo('PrivSignRSA Error',cError)
  return
Endif

// Salva a assinatura no disco 
nH := fCreate(cSignInfo)
fWrite(nH,cSignature)
fClose(nH)

Return

Executado o programa acima, a assinatura gerada foi salva no arquivo “padlock.sign”. Para gerar a mesma assinatura usando a OpenSSL, o comando executado seria:

openssl dgst -sha1 -sign note-juliow-ssd.key -out padlock.sign padlock.png

Verificando a assinatura

Primeiro, precisamos da chave pública para a verificação. Ela pode ser obtida a partir da chave privada usando o seguinte comando Openssl:

openssl rsa -in note-juliow-ssd.key -pubout > note-juliow-ssd-public.key

E, para verificar a assinatura usando a OpenSSL, usamos a imagem, a chave publica e a assinatura a ser verificada:

openssl dgst -sha1 -verify note-juliow-ssd-public.key -signature padlock.sign padlock.png

Agora vamos ver como fazer isso em AdvPL:

User Function MyVery()

Local cImageFile := "\imagens\padlock.png"
Local cStrImage := ''
Local cSignInfo := "\imagens\padlock.sign"
Local cHash := ''
Local cSignature := ""
Local nH, nTam
Local cError

// Lê o conteudo da imagem do disco 
nH := fopen(cImageFile)
nTam := fSeek(nH,0,2)
fSeek(nh,0)
fRead(nH,cStrImage,nTam)
fclose(nH)

// Calcula o SHA1 da imagem 
cHash := SHA1( cStrImage , 1 )

// Le a assinatura do no disco 
nH := fopen(cSignInfo)
nTam := fSeek(nH,0,2)
fSeek(nh,0)
fRead(nH,@cSignature,nTam)
fclose(nH)

// Verifica se a assinatura bate com o HASH do arquivo 
// usando a minha chave publica
lOk := PrivVeryRSA( "\siga0984\note-juliow-ssd-public.key", cHash, 2, cSignature, @cError )

If lOk
  MsgInfo("Assinatura OK" )
Else
  MsgInfo("Falha de verificação de assinatura",cError )
Endif
Return

Observações muito importantes

  • O HASH criptográfico calculado a partir do dado original deve ser gerado em um formato de string binária, e não em string hexadecimal.
  • As chamadas das funções PrivSignRSA() e PrivVeryRSA() devem ser feitas informando no terceiro parâmetro qual foi o algoritmo de HASH utilizado sobre a informação.

Conclusão

Por hora já podemos fazer coisas bem interessantes, no próximo post vamos ver outras duas funções de assinatura e verificação de assinatura disponíveis no AdvPL — EVPPrivSign e EVPPrivVery, e as diferenças delas para as funções vistas agora. Quer saber um pouco mais sobre como a assinatura funciona por dentro ? Consulte o link de referência “RSA sign and verify using Openssl : Behind the scene”

Agradeço novamente a audiência, e desejo a todos TERABYTES DE SUCESSO !!!

Referências

 

View at Medium.com

Um comentário sobre “Criptografia em AdvPL – Parte 13

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s