Qual é a diferença entre as funções signData e signHash?
Ambas funções -- signData
e signHash
-- realizam um algoritmo de assinatura digital utilizando a chave privada de
um dos certificados presentes na máquina do usuário. Para entender a diferença entre as duas funções, precisamos falar
rapidamente sobre os detalhes de um algoritmo de assinatura.
Note
O termo algoritmo de assinatura digital não deve ser confundido com assinatura digital. Leia mais sobre esse assunto no artigo Assinaturas digitais.
O algoritmo RSA, em linhas gerais, tem 4 etapas:
- Cálculo do hash dos bytes a serem assinados
- Codificação da estrutura DigestInfo, que contém o hash e o OID do algoritmo de hash usado para produzi-lo
- Padding do DigestInfo codificado
- Operação matemática sobre DigestInfo codificado e padded
Note
O cálculo de hash realizado na primeira etapa geralmente não é sobre o documento sendo assinado. Nos esquemas de assinatura CMS/CAdES, PAdES e XmlDSig/XAdES, os bytes usados como entrada para o algoritmo de assinatura correspondem à codificação dos "atributos assinados", uma estrutura que contém diversos dados, entre eles o hash do documento.
A função signData
recebe como entrada o to-sign-data e realiza sobre ele todas as etapas, enquanto que a função
signHash
recebe como entrada o to-sign-hash, isto é, o hash pré-computado do to-sign-data, e realiza sobre ele
apenas da segunda etapa em diante.
Ambas funções podem ser usadas na implementação de assinaturas web remotas
independentemente do esquema de assinatura (CAdES, PAdES, etc) sendo utilizado. A escolha da função a ser utilizada
depende do output fornecido pelo código que executa em backend ao final do "preparo" da assinatura remota. Se for
produzido um to-sign-data, utilize a função signData
. Se for produzido um to-sign-hash, utilize a função signHash
.