💡 Exemplo completo em funcionamento disponível no GitHub:
sign-word-with-ml-dsa-certificates-dotnet
O Antigo Caminho Era um Plano de Projeto
Pergunte o que é necessário para tornar a assinatura de documentos pós‑quântica e você receberá um roteiro: avaliar algoritmos, escolher uma biblioteca, escrever uma camada de abstração sobre o código de assinatura, planejar um período de assinatura dupla, orçar um trimestre.
A maior parte disso ainda é válida para a metade organizacional – aquisição de certificados, política, suporte a validadores. A metade de código acabou sendo menor do que o roteiro sugere, e isso vale a pena saber antes que alguém orce um trimestre para isso.
A assinatura ML-DSA é um recurso do GroupDocs.Signature para .NET que assina documentos Word com certificados baseados no FIPS 204, o padrão de assinatura pós‑quântica do NIST. Ela chegou na versão 26.9 e, do ponto de vista do código que a chama, trata‑se de um arquivo PFX diferente.
Existe um Caminho Melhor
Aqui está toda a mudança de código:
using var signature = new Signature(sourcePath);
var options = new DigitalSignOptions(pfxPath)
{
Password = certificatePassword
};
SignResult result = signature.Sign(outputPath, options);
Essa é a mesma chamada usada para um certificado RSA. O algoritmo é uma propriedade do certificado, portanto nenhuma opção o seleciona, nenhuma camada de abstração é necessária e nenhum caminho de código secundário aparece para o período de transição. Aponte DigitalSignOptions para um PFX ML‑DSA e a saída será uma assinatura ML‑DSA.
Ler o certificado de volta a partir do resultado vale a pena enquanto vários certificados estão em uso:
var created = result.Succeeded.OfType<DigitalSignature>().FirstOrDefault();
return created?.Certificate?.Subject ?? "(no certificate returned)";
Escolhendo um Nível, Com Números Em vez de Opiniões
ML‑DSA vem em três conjuntos de parâmetros, correspondendo às categorias de segurança NIST 2, 3 e 5. Mais forte significa maior – tanto a chave quanto a assinatura – e a forma sensata de decidir é assinar seu próprio documento três vezes e observar:
var levels = new Dictionary<string, string>
{
["ML-DSA-44"] = MlDsa44Pfx,
["ML-DSA-65"] = MlDsa65Pfx,
["ML-DSA-87"] = MlDsa87Pfx
};
O exemplo grava uma cópia assinada por nível e registra cada tamanho, portanto o trade‑off é uma medição e não uma tabela de especificação. Para um único contrato a diferença é insignificante; para um arquivo com vários milhões de documentos assinados, trata‑se de uma questão de capacidade que vale a pena considerar antes de padronizar no nível mais alto.
ML‑DSA‑65 é o padrão razoável quando nenhuma política especifica um. Perfis como CNSA 2.0 nomeiam explicitamente o ML‑DSA‑87, e o ML‑DSA‑44 faz sentido apenas quando o tamanho importa mais que a margem.
A Verificação Precisa Apenas do Certificado Público
A história de distribuição permanece a mesma do RSA, que é a segunda boa notícia:
var options = new DigitalVerifyOptions(certificatePath);
if (password != null)
{
options.Password = password;
}
VerificationResult result = signature.Verify(options);
Um destinatário precisa apenas do .cer do assinante e nada mais. O resultado é válido somente quando a assinatura corresponde ao conteúdo e o certificado corresponde pelo número de série e impressão digital, portanto um documento assinado por outra parte falha na verificação – o que o exemplo demonstra ao executar a verificação duas vezes, uma com o certificado correto e outra com o de outra pessoa.
Lado a Lado: Esperado vs. Real
| O que um plano de migração assume | O que 26.9 realmente requer | |
|---|---|---|
| Alteração de código | camada de abstração sobre assinatura | um caminho PFX diferente |
| Superfície da API | novos métodos pós‑quânticos | DigitalSignOptions, inalterado |
| Seleção de nível | configuração da biblioteca | qual certificado você carrega |
| Verificação | nova ferramenta para destinatários | o .cer público do assinante |
| Trabalho de plataforma | manuseio de chaves por SO | nenhum - a biblioteca recorre internamente |
| Cobertura de formatos | todos os formatos | apenas formatos Word, por enquanto |
A última linha é a que restringe o planejamento, e leva à parte honesta deste artigo.
O que Ainda Não Funciona
Dois limites, ambos importantes de saber antes de prometer qualquer coisa.
A cobertura de formatos é apenas Word na 26.9 – DOCX, DOC, ODT e o restante da família Word. PDF, planilhas e apresentações não podem ser assinados com ML‑DSA. Para um pipeline que prioriza PDF, esta versão serve para prototipagem e medição, não para migração.
O suporte a validadores é o outro. Ainda não existe um identificador XML‑DSig padrão para ML‑DSA, portanto o Microsoft Word pode não relatar a assinatura como válida, embora ela seja criptograficamente correta e verificada corretamente via API. Isso é uma lacuna de padrões, não um defeito, e significa que a verificação deve estar no seu código, e não em um revisor que abre o arquivo e olha o banner.
Há também um detalhe de plataforma que não requer ação: .NET não pode ler chaves ML‑DSA em todos os lugares, incluindo Linux no .NET 8. Onde não consegue, o GroupDocs.Signature lê o certificado através do mecanismo Word, de modo que a mesma compilação funciona em um laptop de desenvolvedor e em um contêiner Linux sem código condicional.
Vale a pena fazer agora, dadas essas limitações?
Sim, por duas razões que não têm nada a ver com o código. A aquisição de certificados é lenta – as CAs públicas ainda estão lançando a emissão de ML‑DSA – então o trabalho do lado organizacional se beneficia de um início precoce. E “podemos produzir uma assinatura pós‑quântica hoje?” é uma pergunta que as equipes de conformidade começam a fazer; poder responder com um documento assinado em vez de um plano vale a tarde que isso leva.
O que o Exemplo Realmente Prova
Quatro métodos, executados em ordem, com o código de saída ligado ao resultado. Ele assina o contrato com ML‑DSA‑65 e imprime o assunto do certificado usado. Assina o mesmo contrato nos três níveis e imprime os tamanhos resultantes. Verifica o arquivo assinado duas vezes – uma com o certificado público do assinante, esperando sucesso, e outra com o certificado de outro assinante, esperando falha. Em seguida, lista as assinaturas digitais encontradas na saída.
A segunda verificação é a que vale a pena copiar. Uma rotina que só recebeu entradas válidas não informa nada sobre se rejeitaria uma entrada inválida, e para assinaturas essa é a questão completa.
Exemplo do Mundo Real: O Contrato de Trinta Anos
Arquivos de retenção longa são onde isso deixa de ser teórico. Um contrato assinado hoje e mantido por trinta anos precisa permanecer verificável independentemente do que acontecer com a criptografia nesse período, e “colher agora, descriptografar depois” é um modelo de ameaça documentado para exatamente esse tipo de material.
Para um arquivo assim, a medida prática hoje é de trilha dupla: manter RSA para os formatos que o ML‑DSA ainda não cobre, começar a assinar a saída Word com ML‑DSA‑65 ou 87, e registrar qual algoritmo foi usado por documento para que uma auditoria futura possa distingui‑los sem abrir os arquivos.
Uma Coisa a Corrigir no Exemplo Antes de Copiá-lo
O repositório fornece certificados ML‑DSA autoassinados para que a demonstração funcione imediatamente, o que significa quatro arquivos PFX e uma senha codificada em documents/. Para um certificado de teste descartável válido apenas dentro desse exemplo, isso está ok.
Isso não é um padrão a ser levado ao seu próprio repositório. Gere certificados de teste em tempo de execução, como faz o exemplo de validade de certificado do GroupDocs, ou mantenha‑os fora do controle de versão totalmente. Uma chave comprometida é difícil de revogar e tende a sobreviver à demonstração para a qual foi escrita.
Conclusão
As partes caras da migração pós‑quântica são certificados, políticas e validadores. O código, pelo menos para documentos Word em .NET, é um PFX diferente e a mesma chamada DigitalSignOptions. Clone o exemplo, aponte para um dos seus próprios contratos e você terá três arquivos assinados, dois resultados de verificação e uma comparação de tamanho em poucos minutos – o que é uma base melhor para um plano de migração do que uma estimativa.