ALM–Assinatura Digital de Softwares – Assinatura Digital de Código x Assinatura com Nomes Fortes

Olá Pessoal!

Segue ótimo post escrito pelo Clayton Zambon sobre Assinatura Digital de Software.

Assinatura Digital de Código

É utilizado por empresas e desenvolvedores, para assinar digitalmente os softwares que eles distribuem para seus clientes ou pela Internet. Esta assinatura inclui o nome do desenvolvedor (empresa) protegendo contra injeção de malwares ou outros tipos de corrupções de código. Esta Assinatura de Código fornece aos clientes a mesma segurança e garantia de um software embalado que é vendido em lojas físicas.

Para realizar a Assinatura de Código a Empresa ou desenvolvedor necessita ter um Certificado Digital destinado a realizar a Assinatura de Código.

Assinatura com Nomes Fortes

São usadas ​​para verificar a integridade dos dados que estão sendo passados ​​do autor (o assinante) para um destinatário (o verificador). As assinaturas são geradas e verificadas usando criptografia de chave pública. O signatário de uma mensagem tem um par de chaves criptográficas: uma chave pública, que todo mundo sabe, e uma chave privada, que é mantida em segredo pelo signatário. O verificador só conhece a chave pública, que é usado para verificar se o signatário sabia que a chave privada e a mensagem.

Em alguns casos, quando alguma infra-estrutura adicional está no lugar, as assinaturas digitais podem também ser usadas ​​para aprender com fiabilidade o nome do signatário, e para assegurar um bloco de dados (de uma mensagem, um código, ou assim por diante) não tenha sido modificado depois o assinante criado a assinatura para os dados.

Vários mecanismos são utilizados para implementar assinaturas digitais. A implementação atual de fortes nomes do NET Framework. conta com o algoritmo de chave pública RSA e o algoritmo de hash SHA-1.

Os nomes fortes oferecem um mecanismo poderoso para dar aos assemblys do .NET Framework identidades únicas. O nome forte para um conjunto é composto por cinco partes: uma chave pública, um nome simples, uma versão, uma cultura opcional, e uma arquitetura de processador opcional. A chave pública é uma chave pública RSA. O nome simples é apenas um texto de cadeia, geralmente o nome do arquivo (sem a extensão) que contém o assembly. A versão é um número de versão de quatro partes, sob a forma de Principal.Secundária.Compilação.Revisão (por exemplo, 1.0.0.1).

Fonte: http://msdn.microsoft.com/en-us/magazine/cc163583.aspx

Assinatura de Código

Como verifico se o arquivo possui Assinatura de Código?

No Windows, basta clicar com o botão direito do mouse sobre o arquivo e escolher a opção Propriedades. Na tela que é exibida verifique se é exibida a aba Assinatura Digitais, selecione esta aba e será a lista de assinaturas, caso o arquivo possuía Assinatura de Código existirá na lista no mínimo um Certificado Digital sendo possível visualizá-lo.

Veja no print abaixo a demonstração da assinatura de código contida na DLL AspNetMMCExt.dll presente no diretório C:\Windows\Microsoft.NET\assembly\GAC_MSIL\AspNetMMCExt\v4.0_4.0.0.0__b03f5f7f11d50a3a

clip_image002

Como verifico se o meu Certificado Digital tem a atribuição para Assinar Códigos?

No Windows, basta abrir o console onde ficam armazenados os Certificados digitais digitando MMC em Executar. Escolha o Certificado Digital que deseja verificar e dê um duplo clique sobre o arquivo. Será exibida a tela do Certificado Digital e na aba geral deve ter uma frase informando que o Certificado Digital, garante qie o software provenha do editor de software. Veja no Print abaixo a tela que é apresentada e como é exibida a mensagem:

clip_image004

Onde compro um Certificado Digital de Código?

Há diversas empresas que vendem certificados digitais de código, como por exemplo a GoDaddy.

http://br.godaddy.com/ssl/code-signing-certificate.aspx?ci=87235

Possuindo o Certificado Digital correto, como eu assino digitalmente um arquivo?

Para assinar um arquivo digitalmente no Microsoft Windows, a Empresa ou desenvolvedor pode utilizar a ferramenta SignTool. Esta ferramenta é instalada juntamente com a IDE de programação do Visual Studio mas também pode ser adquirida via download pelo KIT SDK Microsoft Windows.

Possuindo a Ferramenta SignTool você pode tanto verificar se um arquivo está assinado, quanto assinar arquivos digitalmente.

Para verificar se um arquivo está assinado digitalmente basta utilizar o comando abaixo:

Signtool verify C:\diretoriodoarquivo\<arquivo>.exe

Para verificar se uma DLL está assinada digitalmente basta utilizar o comando abaixo:

Signtool verify /a C:\diretoriodaDLL\<arquivoDLL>.dll

Para assinar digitalmente um arquivo ou DLL basta utilizar o comando abaixo:

Signtool sign /f <CertificadoDaEmpresa>.pfx /p <password> C:\diretoriodoarquivo\<arquivoDLLouEXE>.exe

Caso o Certificado digital não possua senha, basta omitir o parâmetro /p.

Uma dica legal é utilizar o parâmetro /debug nas verificações de assinaturas, pois esta opção lista de forma detalhada o certificado digital que está sendo utilizado, então o comando ficaria da seguinte forma:

Signtool verify /debug /a C:\diretoriodaDLL\<arquivoDLL>.dll

Maiores detalhes e parâmetros da ferramenta SignTool podem ser consultados no site http://msdn.microsoft.com/pt-br/library/8s9b9yaz(v=vs.110).aspx

Caso você esteja tentado assinar algum arquivo ou DLL e a mensagem “Signtool Error: No certificates were found that met all the given criteria.” sempre é exibida, significa que o Certificado Digital que está sendo utilizado para a assinatura, não possui os requisitos necessários para efetuar a Assinatura de Código.

Veja abaixo a comparação entre dois certificados digitais, um é utilizado apenas para assinatura digital de documentos eletrônicos e o outro é utilizado para Assinatura de Códigos.

Certificado Digital utilizado para assinatura de documentos eletrônicos

clip_image006

Certificado Digital utilizado para Assinatura de Códigos

clip_image007

Assinatura com Nomes Fortes

Porque usar Assinatura com Nomes Fortes?

Os nomes fortes impedem a duplicação de seu código por um terceiro (que, é claro, desde que você mantenha a chave privada segura). Como mencionado, o NET Framework. Verifica a assinatura ou ao carregar a montagem ou ao instalá-lo no GAC. Sem acesso à chave privada, um usuário mal-intencionado não pode modificar seu código e sucesso reassiná-lo.

Vantagens e pontos a serem observados

Assinatura de nome forte é uma boa ideia para a maioria das aplicações, especialmente aqueles que são implantados através de uma rede ou qualquer outro meio não totalmente controlado pelo implementador. Os anti-spoofing e anti-adulteração benefícios são muito valiosos. No entanto, existem alguns desafios a ter em conta quando se usa assinatura de nome forte.

Em primeiro lugar, todos os assemblys referenciados por um assembly fortemente nomeado também devem ser fortemente nomeados. Se referenciarmos um assembly escrito por terceiros que não for assinado com nome forte, não poderemos assinar com nome forte o nosso assembly.

Fonte:

http://msdn.microsoft.com/en-us/magazine/cc163583.aspx

Como gerar um Assembly assinado com nome forte

Existem outras formas de realizar a Assinatura de Nomes Fortes em arquivos ou DLLs porém descrevo abaixo a mais simples e prática de ser executada.

Utilizando o prompt de comando do Visual Studio 2013 vamos utilizar a ferramenta Strong Name Tool (Sn.exe) para gerar um par de chaves pública/privada. Execute os passos abaixo:

1º Passo: abra o prompt de comando do Visual Studio 2013;

2º Passo: no prompt que é aberto execute o seguinte comando: sn –k <NomeDoArquivo>.snk

3º Passo: Após executar o comando, será criado o arquivo <NomeDoArquivo>.snk no diretório C:\Program Files (x86)\Microsoft Visual Studio 12.0;

4º Passo: copie o arquivo .snk para a pasta onde está localizado o projeto Assembly;

5º Passo: adicione o atributo [assembly: AssemblyKeyFileAttribute(“NomeDoArquivo.snk”)] no arquivo de código fonte AssemblyInfo.cs;

6º Passo: por fim, compile o arquivo de código-fonte.

Prompt de Comando do Visual Studio 2013

clip_image009

Local onde é gerado o arquivo .snk

clip_image011

Arquivo do código-fonte onde deve ser inserido o atributo.

clip_image013

Fonte:

http://msdn.microsoft.com/pt-br/library/xc31ft41%28v=vs.110%29.aspx

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s