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:
- O documento não foi adulterado.
- 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
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)
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)
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
⚠️ 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)