Este artigo atrasou um pouquinho, mas iremos compensar e ainda hoje, mais tarde, sairá outro! 😉
· · ·
Assinatura de código é uma técnica utilizada para garantir a integridade de um aplicativo, permite identificar o desenvolvedor do código e também determinar e garantir o fim ao qual o aplicativo foi desenvolvido.
Quando o código de um aplicativo é assinado, é possível determinar com segurança se o código original foi modificado por alguém que não seja o desenvolvedor, não importando se a modificação foi intencional (por um hacker) ou acidental (um arquivo corrompido). Além disso, caso o desenvolvedor utilize a mesma assinatura, o sistema irá identificar as novas versões (updates) como sendo o mesmo aplicativo assinado e autorizado anteriormente. Esta técnica de assinatura permite que o sistema identifique o aplicativo mesmo que ele seja renomeado, alterado o caminho ou a sua versão.
Todos os tipos de código podem ser assinados, incluindo ferramentas, aplicativos, scripts, bibliotecas, plugins, e “code-like” dados.
Uma assinatura de código consiste em três partes:
- Um identificador único, que será utilizado para identificar ou determinar a que grupo ou categoria o aplicativo pertence (ex:
com.empresa.Programa
). - Uma coleção de checksums, hashes das várias partes do aplicativos, tais como identificador,
Info.plist
, executável principal, arquivos de recursos e assim por diante. Estes checksums são utilizados para detectar as alterações do código ou no identificador do programa. - A assinatura digital, responsável pela assinatura da coleção de checksums, garantindo a integridade das informações.
Alguns recursos do sistema — como por exemplo Parental Controls, Managed Preferences, Keychain Access e o Firewall — utilizam assinaturas de código para verificar se a aplicação que está em execução está íntegra, se não houve algum tipo de modificação. No caso do Parental Controls e do Firewall, aplicativos que não possuem o código assinado, após inclusão do usuário são assinados pelo sistema e colocados em uma base para identificá-los e verificar se eles permanecem inalterados.
Muitos recursos do OS X não se preocupam com a identidade do assinante, apenas se ele foi modificado desde a última verificação; o Parental Controls e o Keychain são exemplos deste tipo de validação. Já outros recursos, como por exemplo o Firewall de aplicação, reconhece apenas assinaturas validadas por uma Autoridade Certificadora a qual o sistema confia, salvo ocasiões em que você tenha definido que o sistema confie na assinatura.
Algumas informações importantes sobre a assinatura de código:
- Não garante que o programa esteja livre de vulnerabilidades de segurança.
- Não garante que o programa carregue um código externo inseguro ou alterado — exemplo: plugins não assinados ou carregados durante a execução.
- Não é uma forma de proteção de direitos autorais (DRM). Embora você possa identificar cópias do seu programa que não foram assinadas por você ou que o seu programa tenha sido modificado, não há nada para impedir que usuários executem o seu programa.
- A validação da assinatura do código é realizada somente quando o sistema ou algum outro programa precisa determinar se o código está íntegro. O Finder, por exemplo, pode executar um programa que tenha um identificador inválido, pois ele não tem nenhuma razão para validar o identificador (em breve falaremos sobre Sandbox e Gatekeeper).
Para verificar se um aplicativo foi assinado digitalmente, utilize o utilitário codesign
disponível na linha de comando. Abra o Terminal e digite:
Aplicativos nativos do OS X são assinados pela Apple (Mail, Safari, iTunes…), desenvolvedores independentes também podem assinar seus apps para Mac. Mais informações sobre como desenvolver para Mac ou como assinar o seu aplicativo digitalmente podem ser encontradas no portal mantido pela Apple aos desenvolvedores.