非对称加密则两份密钥,分别是公钥和私钥,用公钥加密的数据,要用私钥才能解密,用私钥加密的数据,要用公钥才能解密。正常情况下,公钥可以对外公开,而私钥需私密保存。我们常用公钥加密私钥解密的方式来进行加密防止数据明文传输,用私钥加密公钥解密的方式来签名确保数据的完整性防止被篡改。
将任意长度的源文本通过Hash函数计算得到一窜固定长度的文本,要保证不同源文本计算得到的值各不相同,且不能被反推得到源文本。常用的Hash算法有MD5和SHA。
又称公钥数字签名,是非对称加密与数字摘要的结合,用于验证数据的完整性及不可抵赖性。发送方用接收方的公钥对摘要进行加密后和报文一起发送,接受方接受后用相同的Hash算法对报文进行摘要计算,接着用自己的私钥解密得到发送方的摘要,如果两个摘要相同则接收方就能确认该报文是对方发出的且未被篡改。
将App提交审核后,苹果会用官方的私钥对我们提交的App重签名,用户下载到手机后,iOS设备内置的公钥会对App进行验证,验证成功即可正常使用。所以App上传到AppStore后,就跟我们本地的证书/ProvisioningProfile都没有关系了,无论是否过期或被废除,都不会影响AppStore上的安装包。
对于非AppStore安装的应用苹果采用了双重签名的方式,用到了两对密钥,Mac电脑密钥对L,苹果官方密钥对A。
如果别的Mac也要编译签名这个App,可以将私钥导出给其他Mac用,在keychain里导出私钥,就会存成.p12文件,其他Mac导入了这个私钥后便可用同一套苹果证书及ProvisioningProfile文件。In-House安装不限制设备ID数。
重签是把已发布/未发布的包重新签名为自己的证书和签名,关键就是替换ipa内的证书和描述文件。主要通过codesign命令完成。
0查看ipa包是否加壳,只有未加壳的包才可以重签名。
$otool-l「Mach-O文件」|grepcrypt//输出cryptid为0代表已经砸壳,即解密,为1或者2表示以第1类或者第2类加密方案加密。1.1查看本地证书列表并记录下要用来签名的证书名,例如"iPhoneDistribution:XXXXX(XXX)"。
$securityfind-identity-v-pcodesigning1.2新建Xcode工程,用1.1证书编译后生成新App,将App包里embedded.mobileprovision文件取出替换ipa包中的文件。
2.1删除ipa包内部可被重签名的插件(PlugIns目录下)。
2.2将ipa包内的所有Framework重签名(Frameworks目录下)。
$codesign-fs"iPhoneDistribution:XXXXX(XXX)"xxx.framework2.3查看Mach-O文件是否有系统权限,若没有则添加权限。
$chmod+x「Mach-O文件」3.1将ipa包内info.plist的BundleId修改为1.1中工程的BundleId。
3.2用命令查看embedded.mobileprovision文件,找到其中的entitlements字段,并且复制entitlements字段和其中的内容。
$securitycms-D-i「embedded文件路径」3.3新建entitlements.plist文件,将复制内容拷贝到文件中,然后将entitlements.plist复制到ipa的同级目录下。
3.4对App进行重签名,并压缩成新的ipa包。
//重签名$codesign-fs"iPhoneDistribution:XXXXX(XXX)"--no-strict--entitlements=entitlements.plist//压缩ipa包$zip-r「输出的文件名(.ipa)」Payload/4将ipa包安装到手机,若能同时存在两个应用且能正常运行则表示重签名成功。
可以在启动时校验描述文件信息与打包时是否一致。例如判断组织单位:先记录证书中的组织单位信息。