对称加密
- 在对称加密中,加密与解密使用的
同一个密钥
; - 常见的对称加密算法有:
- DES:将64位明文加密称64位密文的对称加密算法,密钥的长度为56位;
- 3DES:将DES重复三次所得到的一种加密算法;
- AES:取代DES成为新标准的一种对称加密算法;
密钥传输问题
- 在使用对称加密时,一定会遇到密钥传输的安全性问题;
- 通信的双方必须要互通密钥,才能实现一方加密,另一方解密,完成完整的信息传输;
非对称加密
- 密钥有两种,分别为:公钥和私钥,两者是一一对应的;
-
消息的接收者生成一对密钥
,公钥用来加密
,私钥用来解密
; -
公钥可以传输,私钥由消息的接受者保管
; - 目前使用最广泛的非对称加密算法是
RSA算法
混合密码系统
- 对称加密,不能保证密钥传输的绝对安全,但速度很快;
- 非对称加密,加密,解密的速度比较慢,但密钥传输安全;
- 将两者结合在一起,就组成了混合密码系统,兼顾两者之间的优点,工作流程如下:
- 消息的接收者生成一对密钥即
公钥
和私钥
; - 消息的接收者将公钥传输给消息的发送者;
- 消息的发送者会随机生成一个
会话密钥
,然后用消息的接收者的公钥进行加密,再传给消息的接收者; - 消息的接收者拿到加密后的会话密钥,利用自己的私钥进行解密,获取到会话密钥,会话密钥的传输使用的
非对称加密
; - 之后两者之间的消息发送,使用会话密钥进行
对称加密
传输,提高效率;
- 消息的接收者生成一对密钥即
单向散列函数
- 单向散列函数,可以根据消息内容计算出散列值,任意长度的消息,计算出固定长度的散列值,消息不同,散列值也不同;
- 散列值可以看成消息的唯一标识;
- 单向散列函数,又称为消息摘要函数,哈希函数,输出的散列值,也被称为消息摘要,指纹;
- 常见的单向散列函数:
- MD4,MD5:生成128位的散列值,目前已经不安全了;
- SHA-1:生成160位的散列值,目前已经不安全了;
- SHA-2:包含SHA-256,SHA-384,SHA-512,散列值的长度分别为256位,384位,512位;
- SHA-3:全新标准;
单向散列函数的应用
- 防止数据被篡改;例如原始文件利用单向散列函数生成一个散列值,若文件数据被篡改,那么篡改后的文件生成的散列值与原始的散列值肯定不同;
- 口令加密:登录,注册时密码使用单向散列函数生成密文,不能直接使用明文传输;
数字签名
- 生成签名:由消息的发送者完成,通过
签名密钥
生成; - 验证签名:由消息的接收者完成,通过
验证密钥
验证; - 如何保证签名是消息的发送者自己签的,答案是:
用消息发送者的私钥进行签名
; - 消息可能所占空间较大,可先生成对应的散列值,然后用私钥对消息的散列值进行签名;
数字签名的过程
- 数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改;
- 其作用是
识别消息是否被篡改
; - 数字签名的使用的一个重要前提是:
用于验证签名的公钥必须属于真正的发送者
- 其原理图如下所示:
中间人攻击
- 其原理图如下所示:
- 中间攻击者拦截了A的公钥,伪造了公钥;
- AB两者之间的通信,完全感知不到中间攻击者的存在,很危险!!!
数字证书
- 数字证书能
验证公钥的合法性
; - 密码学中的证书,全称叫
公钥证书
,里面包含有姓名,邮箱等个人信息,以及此人的公钥; - 数字证书是由认证机构(CA)施加数字签名的,即CA用自己的私玥对某个人的个人信息和他的公钥进行签名,生成一个数字证书;
- CA就是能够认定
公钥确实属于某人
,并能够生成数字签名的个人或者组织;
iOS签名机制
- 其作用是保证安装到用户手机上的App都是经过Apple官方允许的,不管是真机调试,还是发布App,开发者都需要经过一系列复杂的步骤,如下:
- 1.生成
CertificateSigningRequest.certSigningRequest文件
- 2.创建
iOS_development.cer / iOS_distribution.cer证书文件
- 3.注册device的UDID,添加App的唯一标识AppBundleID;
- 4.创建
xxx.mobleprovision描述文件
- 只有完成上述的4步操作,真机才能安装上App进行调试;
- Apple服务器充当CA认证机构,其保证Mac公钥的合法性;
- 我们在进行App真机调试时,会进行一下步骤:
- 首先访问钥匙串,导出CertificateSigningRequest.certSigningRequest文件,CertificateSigningRequest.certSigningRequest文件本质就是Mac的公钥;
- 然后在苹果的开发者网站上创建证书文件iOS_development.cer或者iOS_distribution.cer,需要上传CertificateSigningRequest.certSigningRequest文件,其本质是将Mac的公钥传给苹果的服务器,然后苹果的服务器利用自己的私钥,对Mac的公钥进行签名,最后生成证书文件;
- 最后在苹果的开发者网站上创建mobleprovision描述文件,需要选中刚刚生成的证书文件,device的UDID以及App的唯一标识AppBundleID,其本质是将选中的数据全部传给苹果的服务器,然后苹果的服务器利用自己的私钥,进行签名,最后生成经过签名后的mobleprovision描述文件;
iOS重签名
- 破解他人的App,然后注入自己写的代码,最后生成的ipa包是不能直接安装到非越狱真机设备的,因为你修改了App的原始代码,其签名发生了变化,苹果在验证App签名时,就会不通过;需要对其重新签名,才能安装到
非越狱真机设备
上;
codesign --> iOS重签名的具体步骤:
场景一:Xcode新建一个工程,并写入简单的代码,运行直接安装到非越狱真机设备
上,然后找到其.app文件,本地创建一个Payload
文件夹,将.app文件放入Payload文件夹中,然后压缩成.zip
文件,最后将其后缀改成.ipa
,即Payload.ipa
文件;然后将Xcode运行安装的包从设备上删除,再将Payload.ipa安装到当前设备上,是可以安装的;
场景二:流程与场景一相同,不同点在于找到.app文件的Mach-O文件,利用MachOView打开并修改文件内容,最后生成Payload.ipa
文件,再将Payload.ipa安装到当前设备(非越狱)上,是安装不上的,因为你修改了文件内容,那么其签名被破坏了,所以安装不上;不过越狱设备是可以安装的;
- 第一步:准备一个
embedded.mobileprovision
描述文件(必须是付费证书产生的,appid,device一定要匹配),并放入app包中;- 可以去iOS开发者网站去创建然后下载;
- 可以通过Xcode自动生成,然后在编译后的App包中找到,如下所示:
- 第二步:从
embedded.mobileprovision
描述文件中,提取出entitlements.plist
权限文件,执行终端命令: -
security cms -D -i embedded.mobileprovision > temp.plist
生成一个临时的plist文件; -
/usr/libexec/PlistBuddy -x -c 'Print :Entitleements' temp.plist > entitlements.plist
得到entitlements.plist
权限文件; - 第三步:查看可用的证书,获取证书ID,终端执行命令如下:
security find-identity -v -p codesigning
- 第四步:对App包进行重新签名,终端执行命令如下:
codesign -fs 证书ID --entitlements entitlements.plist xxx.app
iOS重签名的GUI工具
第一种:iOS App Signer
- 地址:https://github.com/DanTheMan827/ios-app-signer
- 可以对.app重签名打包成ipa;
- 需要在.app包中提供对应的
embedded.mobileprovision
文件
第二种:iReSign
- 地址:https://github.com/maciekish/iReSign
- 可以对ipa进行重签名;
- 需要提供
entitlements.plist
与embedded.mobileprovision
文件路径
iOS重签名tweak的原理
- 新建tweak项目,本质是创建一个与当前App相关的动态库;
- 需要将新建的动态库文件与当前App的Mach-O文件,打包生成一个文件;
- 可以使用insert.dylib库将动态库注入到Mach-O文件中,其地址为:https://github.com/Tyilo/insert.dylib
- 命令行:
insert dylib 动态库路径 目标Mach-O文件
- 有两个常用的参数选项:
-
weak
:即使动态库找不到也不会报错; -
--all-yes
:默认后面的所有选择都为yes;
-
- insert dylib的本质是往Mach-O文件的Load Command中添加一个LC_LOAD_DYLIB或LC_LOAD_WEAK_DYLIB
- 通过otool可查看Mach-O文件的动态库依赖信息,
otool -L Mach-O文件
- 当前创建的动态库可能会依赖其他的动态库,那么依赖的动态库也需要打包进来,否则会报错;
- 通过Theos开发的动态库插件,
- 默认都依赖于/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
- 如果要将动态库插件打包到ipa中,也需要将CydiaSubstrate打包到ipa中,并且修改下CydiaSubstrate的加载地址;其命令行为:
install name_tool -change 旧地址 新地址 Mach-O文件
- 常见的两个环境变量:
- @executable_path代表可执行文件所在的目录;
- @loader_path代表动态库所在的目录;
-
tweak创建的动态库以及动态库所依赖的其他动态库也需要重签名
,命令为:codesign -fs 证书ID 动态库名称
- 最后再对.app文件进行重签名;签名的app必须脱壳,否则签名不成功;