DEV Community

William Moreira da Silva
William Moreira da Silva

Posted on

Assinatura Digital em Elixir com Criptografia Assimétrica

Você já se perguntou como funciona um fluxo de assinatura digital?

Quando falamos de documentos digitais, surge a dúvida: como garantir que esse arquivo é autêntico e não foi alterado? É justamente para resolver isso que existe a assinatura digital.

A ideia é simples: você gera um hash do documento (uma espécie de “impressão digital”) e usa sua chave privada para assinar esse hash. Quem receber o documento pode, com a chave pública correspondente, verificar se a assinatura é legítima. Assim, temos duas garantias:

  1. O documento não foi adulterado.
  2. A assinatura só poderia ter vindo do dono da chave privada.

No caso de PDFs — pense em contratos ou qualquer documento de valor jurídico — isso é ainda mais relevante. No Brasil, por exemplo, a assinatura digital é regulamentada pela ICP-Brasil, dando validade legal a documentos assinados eletronicamente.

E aí entra o nosso protagonista: Elixir. Por rodar na máquina virtual do Erlang (a BEAM), a linguagem já oferece ferramentas nativas de criptografia, prontas para uso. Ou seja, você não precisa de bibliotecas externas para começar a brincar com chaves e assinaturas digitais.


Mão na massa: assinando em Elixir

1. Gerando um par de chaves

Primeiro passo: criar o par de chaves RSA (privada e pública). Com elas, vamos assinar e validar os documentos.

# Criando um par de chaves RSA com 2048 bits
{:ok, rsa_key} = :public_key.generate_key({:rsa, 2048, 65537})
{:RSAPrivateKey, _, modulus, public_exp, _private_exp, _, _, _, _} = rsa_key
# private_key é a chave que você deve manter em segredo absoluto. Ela nunca deve ser compartilhada.
public_key = {:RSAPublicKey, modulus, public_exp}
# public_key é a chave que pode ser distribuída para qualquer pessoa que precise validar suas assinaturas.
private_key = rsa_key
Enter fullscreen mode Exit fullscreen mode

Pronto, agora temos as duas chaves na mão.

⚠️ Boa prática: em um sistema real, essa chave privada não deve ficar no código nem em arquivos simples. algum tipo de cofres digitais como HashiCorp Vault.


2. Gerando o hash de um PDF

Antes de assinar, precisamos transformar o conteúdo do arquivo em um hash. Esse hash vai ser a base da assinatura.

pdf_content = File.read!("contrato.pdf")
# O hash é como a impressão digital do documento (podemos dizer que é um resumo criptográfico).
hash = :crypto.hash(:sha256, pdf_content)
Enter fullscreen mode Exit fullscreen mode

Alterou uma vírgula no PDF? O hash já muda completamente. Isso garante a integridade.

⚠️ Boa prática: sempre use algoritmos de hash considerados seguros. Evite MD5 ou SHA-1, que já foram quebrados e não são confiáveis para assinatura digital.


3. Assinando com a chave privada

Com o hash pronto, agora é só assinar:

# Estamos aplicando a chave privada sobre o hash.
signature = :public_key.sign(hash, :sha256, private_key)
Enter fullscreen mode Exit fullscreen mode

O resultado, signature, é uma sequência de bytes que comprova que você (e só você) poderia ter gerado essa assinatura, já que só você tem a chave privada. Esse signature é o que vai junto do documento. Ele prova que quem assina tinha a chave privada correta.

⚠️ Boa prática: normalmente, essa assinatura é guardada separada do arquivo (como um .sig) ou embutida em metadados do PDF. Assim, o documento em si continua intacto.


4. Validando com a chave pública

Quem recebe o documento precisa verificar se está tudo certo:

# Aqui, usamos a chave pública para verificar a assinatura.
valid? = :public_key.verify(hash, :sha256, signature, public_key)

# Se valid? for true, temos duas garantias: o documento não foi alterado e foi assinado por quem realmente possui a chave privada correspondente.
if valid? do
  IO.puts("Tudo certo: assinatura válida e documento íntegro.")
else
  IO.puts("Ops! Assinatura inválida ou documento adulterado.")
end
Enter fullscreen mode Exit fullscreen mode

⚠️ Boa prática: sempre valide o hash antes de confiar no documento. Não basta “parecer” assinado; é preciso confirmar criptograficamente.

Simples assim!!


5. Indo além

Esse fluxo básico já garante muita coisa. Mas no mundo real, é importante expandir nos seguintes pontos:

  • Múltiplas assinaturas em um mesmo PDF, cada uma com seu carimbo.
  • Metadados no próprio PDF, guardando assinatura, certificados e tudo mais.
  • timestamp, pra provar não só que o documento é válido, mas quando foi assinado.

Esses que pontos são super úteis em cenários jurídicos ou financeiros, onde cada detalhe pode toda faz diferença.


Conclusão

A assinatura digital é essencial para garantir autenticidade, integridade e validade jurídica de documentos. E vimos como o Elixir + Erlang tornam esse processo simples e confiável: em poucas linhas conseguimos gerar chaves, assinar e validar documentos, com a robustez de uma plataforma madura.

Entendemos o conceito de assinatura digital, vimos como gerar chaves RSA, como criar e assinar o hash de um PDF e como validar essa assinatura. A pergunta da introdução era: como funciona um fluxo de assinatura digital? Agora temos a resposta clara — ele envolve gerar um hash, assinar com a chave privada e validar com a chave pública.

Ou seja, além de mostrar a versatilidade do Elixir no mundo da criptografia, conseguimos destrinchar um processo que, no fim das contas, é bem mais direto do que parece.

No fim, o fluxo de assinatura digital nada mais é do que hash + chave privada + chave pública — simples na teoria, poderoso na prática.

Top comments (0)