A assinatura e
verificação de código é o processo de assinatura digital de
executáveis ou scripts para garantir que o software que você está
executando não tenha sido alterado desde que foi assinado. A
assinatura de código ajuda a proteger contra artefatos corrompidos,
quebra de processo (entrega acidental de algo errado) e até
intenções maliciosas.
A assinatura digital contempla os requisitos básicos dos pilares da Segurança da Informação, o C.I.D.A.L. que
reúne cinco aspectos:
Confidencialidade, Integridade, Disponibilidade,
Autenticidade e Legalidade. Esses aspectos trazem especificamente esses
conceitos:
Confidencialidade - tem a ver com a privacidade dos dados da
organização. Esse conceito se relaciona às ações tomadas para assegurar
que informações confidenciais e críticas não sejam roubadas dos sistemas
organizacionais por meio de ciberataques, espionagem, entre outras
práticas.
Integridade
- Dados inteiros, completos, retos e incorruptíveis. Quando enviamos ou
recebemos qualquer tipo de informação queremos que esses dados sejam
verdadeiros, ou seja, não seja alterado por outra pessoa. Por exemplo,
ao fazermos um backup de determinado arquivo, queremos que esse backup
seja uma cópia fiel do arquivo original e se mantenha sempre assim.
Disponibilidade
- Informações que pode ser entregue imediatamente ao solicitador. Todas
as nossas informações estão armazenadas em algum local, hoje em dia
quase tudo em computadores, agora imagine que se você precise de uma
determinada informação e quando for acessá-la não consegue porque o
servidor está indisponível, não podemos deixar que isso ocorra.
Autenticidade
- Dados de confiança e Genuínos. Ao envirmos algum dado queremos ter
certeza de enviar para o receptor correto e ao recebermos queremos ter
certeza que foi enviado pelo emissor verdadeiro. Um exemplo é a troca de
e-mails, devemos garantir a veracidade do emissor e receptor.
Legalidade
- Garante a legalidade (jurídica) da informação; Aderência de um
sistema à legislação; Característica das informações que possuem valor
legal dentro de um processo de comunicação, onde todos os ativos estão
de acordo com as cláusulas contratuais pactuadas ou a legislação
política institucional, nacional ou internacional vigentes.
Assim podemos
dizer que para se ter uma Segurança das informações na rede, esses
aspectos citados acima tem que estar compridos arrisca para a segurança
seja constante e plena.
Assim a assinatura
digital garante a:
Confidencialildade,
porque esta cifrada e protegida por chaves digitais, se a mensagem for
indevidamente interseptada não será possível ou muito difícil conhecer
seu conteúdo
Integridade, porque através da validação com hash e a chave eletrônica temos a confirmação de que o objeto está integro e não foi adulterado.
Autenticidade não permitindo o
repúdio da autoria, isto é garante que o objeto e original que não
foi alterado, e comprova a sua autoria, tornando o objeto 100%
confiável, isso é possível através da assinatura digital com a chave privada que única
A assinatura e
verificação de código funcionam da seguinte maneira. Além de
escrever o código, o autor executa uma função de hash com o código
como entrada, produzindo um resumo. O resumo é assinado com a chave
privada do autor, produzindo a assinatura. O código, a assinatura e
a função hash são entregues ao verificador. O verificador produz o
resumo a partir do código usando a mesma função hash e, em
seguida, usa a chave pública para descriptografar a assinatura. Se
os dois resumos corresponderem, o verificador poderá ter certeza de
que o código não foi violado.
Gerar o par de
chaves:
Comando ssl para
geração de chaves. ‘ ssh-keygen -t rsa ‘
edpes@criativo:~$
ssh-keygen -t rsa
Generating
public/private rsa key pair.
Enter file in which
to save the key (/home/edpes/.ssh/id_rsa): edpes_rsas
Enter passphrase
(empty for no passphrase):
Enter same
passphrase again:
Your identification
has been saved in edpes_rsas.
Your public key has
been saved in edpes_rsas.pub.
The key fingerprint
is:
SHA256:rYY6ZOFLglYye7hSmyhgZZZ3jUi0zIblbnvnlG741dI
edpes@criativo
The key's randomart
image is:
+---[RSA 2048]----+
| .o |
| *.. |
| .o*. o |
| o *+o o o |
| .X..+. S . |
|o=o.* .. .. o |
|+ooB o..++ o E |
|+.o o..o=.. . |
|o .. o+ |
+----[SHA256]-----+
As chaves já foram
geradas, a chave privada já esta no formato pem, agora precisamos
converter a chave publica para o formato pem também;
O formato de
arquivo padrão para o OpenSSL é o formato PEM. O formato PEM deve
ser legível em ASCII e seguro para editores e documentos de texto
ASCII. O formato PEM é um formato de contêiner e pode incluir
certificados públicos ou cadeias de certificados, incluindo chave
pública, chave privada e certificado raiz. Os arquivos PEM podem ser
reconhecidos pelos cabeçalhos BEGIN e END.
Para exportar uma
chave pública no formato PEM, use o seguinte comando OpenSSL.
$ openssl rsa -in example_rsa -pubout -out public.key.pem
edpes@criativo:~$
openssl rsa -in edpes_rsas -pubout -out edpes_rsas.pub
Enter pass phrase
for edpes_rsas:
writing RSA key
Já de posse das
chaves podemos agora assinar e validar um texto plano um arquivo ou
uma string.
Para assinar o
arquivo usamos o seguinte comando.
openssl dgst -sha256 -sign my_private.key -out
Assinado.txt.sha256 objetoparaAssinar.txt
openssl enc -base64 -in objetoparaAssinar.txt -out
objetoparaAssinar.txt.base64
Validar a
asssinatura:
A verificação de
assinatura garante que a assinatura corresponda ao código original.
Se o código foi alterado (até mesmo a adição de um único
caractere de nova linha), uma assinatura diferente será produzida e
a verificação falhará.
A verificação da
assinatura funciona na direção oposta. Para verificar se a
assinatura está correta, você deve primeiro calcular o resumo
usando o mesmo algoritmo que o autor. Em seguida, usando a chave
pública, você descriptografa a assinatura do autor e verifica se os
resumos correspondem.
Podemos decodificar
e validar o objeto com o seguinte codigo
openssl enc -base64 -d -in objetoparaAssinar.txt.base64 -out sign.txt.sha256
openssl dgst -sha256 -verify public.key.pem -signature sign.txt.sha256 codeToSign.txt
Com isso o ciclo esta completo, codificamos e assinamos sempre com a chave Privada e decodificamos com a chave Pública.