代码签名

名称解释

  代码签名是对可执行文件或脚本进行数字签名.用来确认软件的来源并保证在签名后未被修改或损坏的措施。和数字签名原理一样,只不过签名的数据是代码而已.

为什么要使用代码签名?

  在iOS出来之前,以前的主流操作系统软件随便从哪里下载都能运行,系统安全存在隐患,盗版软件,病毒入侵,静默安装等等.苹果希望解决这样的问题,要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,保证方法就是通过代码签名。

实现原理

iOS代码签名机制

1.基本原理

  代码签名的技术基础是数字签名,也就是非对称加密算法。如果我们iOS设备安装APP只通过App Store这一个途径,代码签名的实现就很容易, 在iOS的系统中内置一个公钥,私钥由苹果后台保存,我们传APP到AppStore时,苹果后台用私钥对APP数据进行签名,iOS系统下载这个APP后,用公钥验证这个签名,若签名正确,这个APP肯定是由苹果后台认证的,并且没有被修改过,也就达到了苹果的需求:保证安装的每一个APP都是经过苹果官方允许的。

2.iOS的双层签名机制

  实际上iOS应用的安装除了app store,还有开发者调试和企业安装两种形式。对于这两种安装方式,他们具有以下需求

  1)安装包不需要上传到App Store,可以直接安装到手机上.

  2)苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权:a.经过苹果允许才可以安装;b.不能被滥用导致非开发APP也能被安装

于是,iOS采用的方案是双层代码签名。

  mac系统中有自身的非对称加密的一对公私钥,Xcode即可完成,这里称为公钥M和私钥M;苹果系统里有固定的一对公私钥,私钥在苹果后台,公钥在每个iOS系统里,这里称为公钥A和私钥A。

  首先,将公钥M和一些开发者的信息传到苹果后台,这个就是申请证书时用到的CSR文件。苹果后台使用私钥A对公钥M进行签名,得到的数据包包含公钥M和苹果的签名,这个就是发放给开发者的证书。申请证书之后,用户申请appid和Provisioning Profile描述文件,Provisioning Profile包含了证书、授权设备uuid,以及app的权限,同样是经过苹果签名的。

  然后在mac上对app开发编译完毕后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的Provisioning Profile文件打包进APP里,文件名为embedded.mobileprovision。

  在安装时,iOS系统解压ipa安装包,可以得到embedded.mobileprovision文件,取得证书,通过系统内置的公钥A,去验证证书的数字签名是否正确。验证证书后确保了公钥 M 是苹果认证过的,再用公钥M去验证APP的签名,这里就间接验证了这个APP安装行为是否经过苹果官方允许。

Android签名机制

  Android 不同于iOS只能安装app store上的应用,允许随意安装来自第三方的应用,同样也要求开发者为开发的应用进行签名,但证书不需要由证书认证中心签名,使用开发者自制的签名证书。Android 系统不会安装或运行没有正确签名的应用,此规则适用于任何地方运行的Android系统。因此在真机或模拟器上运行或者调试应用前,必须为其设置好签名。签名除了为了保证app的真实性和完整性,还有以下几个好处:

1.应用程序升级 -  当发布应用的更新时,如果想染给用户无缝的升级到新版本,需要继续使用相同的某个或某套证书来签名更新包,当系统安装应用的更新时,它会比较现在的版本和新版本的证书,如果证书吻合,包括证书数据和顺序都吻合,那么系统允许更新,如果新版本所做的签名不是匹配的,那么将需要给用起一个不同的包名 - 在这种情况下,用户相当于安装了一个完全新的程序。

2.用用程序模块化 - Android允许相同证书签名的应用程序运行在相同的进程中,此时系统会将它们作为耽搁应用程序对待,在这种方式中,可以按模块化的凡事部署应用,用户可以根据需要独立的跟新每一个模块。

3.代码、数据的授权共享 - Android提供模式匹配的权限控制机制,因此一个应用可以暴露功能给另一个用指定证书签名的签名的应用,通过用相同证书签名多个应用,以及使用模式匹配的权限检查,应用程序可以以安全的方式共享代码和数据。

两种签名:

1、调试模式下签名(sdk 为应用自动生成一个签名证书,调试模式下签名的应用不能对外发布,因为由构建工具创建的证书是不安全的,应用商店不接受调试证书签名的apk)。这种模式下密钥在不同机器上可能都不一样,如果换了机器进行版本升级将不能覆盖安装。

2、发布模式下签名(需要生成自己的证书)

注:给自己开发的app签名,就代表着我们自己的版权,之后要进行升级,也必须要使用相同的签名才可以,签名代表着自己的身份(即 keystore,是一个包括私人密钥集合的二进制文件),创建的keystore 多个app可以使用同一签名。

  签名的原理也是基于非对称加密算法。给apk签名有两种方法,一种是通过命令行,android在公布的源码包中提供了一个工具—signapk.jar,用于进行应用程序的签名,签名命令如下:

java -jar signapk.jar certificate.pem key.pk8 UnsignedApp. apk SignedApp.apk

其中,certificate.pem和key.pk8分别为用于签名的公钥证书和私钥文件;UnsignedApp.apk是未签名的Android应用程序;SignedApp.apk是签名后的Android应用程序。通过对应用程序包(apk为zip压缩文件)解压缩后的数据对比,可以看出签名后的apk包中多了一个目录“/META-INF”,此目录下包含三个文件:MANIFEST.MF、CERT.SF、CERT.RSA。具体的签名过程如图所示,包含5个步骤:

  另外一种签名方式是使用ADT Export Wizard,例如在android应用的开发工具android studio里的Generate Signed APK和Project Structure里可以进行进行配置来生成签名,配置好后,项目文件里会自动补全相关代码。

验证机制

  Android 系统使用“PackageInstaller”程序进行应用程序的安装,并在安装过程中进行代码签名验证。(1)调用verifySignature() 函数,验证CERT.RSA文件中的签名值确实是从CERT.SF签名得到 ;(2)调用JarVerifier.verify()函数,验证MANIFEST.MF文件的摘要确实同CERT.SF提取的摘要值一致;(3)对包中除了签名数据之外的其它文件调用VerifierEntry.verify()函数,验证文件的摘要值等于MANIFEST.MF中的摘要值。安装后,应用程序每次启动时,android系统也会进行简单的路径和时间戳的验证。

Windows代码签名机制

  微软公司在windows平台下设计了一种代码签名机制,并且在64位操作系统的平台下强制性地对涉及到内核的驱动程序进行签名验证。为了避免用户应用程序访问或修改关键的操作系统数据,windows使用了两种处理器访问模式,用户模式和内核模式。微软代码签名机制的策略为:每次驱动程序系统文件被加载到内存中时,代码签名机制会检测被加载到内核中的驱动程序或系统文件是否已经被签名,此规则适用于每个运行内核权限的模块。不仅是普通用户账户,计算机的管理员账户也同样不能加载未签名的代码。

原文地址:https://www.cnblogs.com/sssssaylf/p/12658485.html

时间: 2024-08-01 06:17:07

代码签名的相关文章

iOS代码签名理解

前言 做了几年iOS app coder了,对于证书的生成.使用流程烂熟于心,然而对于这套机制的原理却一直不甚理解.近来由于工作需要仔细研究了一下,特将自己的学习经验记录于此,以供大家学习指正. 问题 通常的iOS应用的签名流程是这样的(这里只是大概写一下,具体流程网上有很多): 访问钥匙串,使用“证书助理”的“从证书颁发机构请求证书”生成一个CertificateSigningRequest.certSigningRequest文件. 打开https://developer.apple.com

第六篇 SQL Server安全执行上下文和代码签名

本篇文章是SQL Server安全系列的第六篇,详细内容请参考原文. SQL Server决定主体是否有必要的执行代码权限的根本途径是其执行上下文规则.这一切都可能复杂一个主体有执行代码的权限,但是却没有访问代码中基础对象的权限,比如表中的数据.这一篇将探讨SQL Server的执行上下文.所有权链接和模拟,以及告诉你如何通过T-SQL代码控制访问数据.执行上下文当用户执行一个存储过程或其他数据库代码,SQL Server检查以确保用户不但有执行过程权限,而且有代码访问的数据库对象的权限.如果没

【转】代码签名探析

转至:objc中国 代码签名探析 dopcn  15 Oct 2014 分享文章 "用户会感激代码签名带来的好处" – Apple Developer Library: Code Signing Guide 在 iOS 或 OS X 平台上进行应用开发时,你所需要使用的 API 大多设计得简洁明了.你可以轻易地实现酷炫的动画效果,便捷地进行应用发布前测试,或是用 Core Data 将数据安全的存储在本地.但是总有一天,你会碰上代码签名 (code signing) 和配置文件 (pr

android代码签名和混淆打包

研究了一下android的apk的签名和代码的混淆打包,如果不混淆打包,那么apk可以直接被人反编译出来查看源码,混淆打包虽然还是能看懂,但是没有那么好懂了,至少要话费些时间 如果不混淆,反编译后的代码如下: 基本上就是源码. 如果混淆后,反编译后的代码如下: 代码中出现很多的a.b.c之类的变量命名,所以要读懂就具有一定的困难了! 下面先说一下apk的签名: 1.apk签名必须先弄一个key,如何生成key呢?那么就要运用jdk来生成. 首先必须把jdk在系统环境变量中配置好.这个就不多说了,

天威诚信代码签名证书助手操作指南

天威诚信数字签名工具 代码签名工具,帮您一站式完成,证书管理,数字签名,工具更新,让数字签名变得如此简单! 证书管理支持多个主流时间戳地址:支持时间戳自主选择功能:支持签名描述和URL:支持双签名,并自主选择不同哈希算法的证书: 数字签名保存用户输入参数:导出私钥支持设置密码,更安全:一键签名,自动识别如CAB包中子文件,并同步签名:独家支持EV证书 签署多个文件只需输入一次密码功能,更快捷: 工具更新应用程序内置多种内核交叉证书.使用对应品牌的证书进行交叉签名时,程序会自动识别相应交叉证书链,

Thawte 企业版代码签名证书

  Thawte企业版代码签名证书 ,严格验证企业身份,如果您是个人开放者,请申请Thawte 个人代码签名证书.Thawte企业代码签名证书 可帮助程序开发者使用微软代码签名工具(Microsoft Authenticode)为他们的程序进行数字签名.你可以在互联网上传送经过代码签名的软件,包括:可执行文件.设备驱动.中间件.ActiveX控件,用户可以通过检验数字签名,来确认软件开发者的身份,以及在传送过程中是否被别人篡改或破坏.如果您需要签名内核驱动代码,需要申请Symantec 单位代码

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

记录我的第一次代码签名

代码签名是对软件进行标识的一个过程,它通过对软件增加了发布商的信息来检查软件在发布后是否被修改或受病毒影响.在软件出售前进行签名已经成为了行业范围的专业实践.随着用户的安全意识的提高,现在越来越多的用户限制下载未签名的软件,因此作为专业的软件公司,在软件出售前进行签名已经成为必不可少的一步. 要进行代码签名,需要以下准备:1)代码签名证书和密码:2)代码签名工具:3)时间戳服务器的URL地址: 代码签名工具代码签名工具,微软提供了两套代码签名工具, 1)signcode.exe,从1998年开始

使用Symantec代码签名证书对代码进行签名的 5 个理由

借助 Symantec Code Signing,在更多平台上将您的代码提供给更多客户,我们总结了5大理由告诉软件开发者在发布自己的软件时一定要购买Symantec 代码签名证书签名即将发布的软件. 1. 可支持更多平台,让您最大限度地提高软件分发量,从而提供您的收入 两大趋势使代码签名比以往更重要: 一是移动和桌面设备个人用户应用程序呈爆炸性增长,二是恶意软件激增.越来越多的软件发行商和移动网络提供商要求提供来自受信任的证书颁发机构 (CA) 的代码签名,否则不接受分发的代码.Symantec

SQL Server安全(6/11):执行上下文与代码签名(Execution Context and Code Signing)

在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Server里的安全功能充分利用,不用在面对特定威胁,不能保护你数据的功能上浪费时间. SQL Server决定主体是否有需要的许可执行代码的基本方式是它的执行上下文角色.这都是复杂的可能性,主体有执行代码的许可,但没有代码访问的潜在对象的许可,例如表里的数据.这篇文章会探寻SQL Server执行上下