Mach-O
- Mach-O 是Mac/iOS上用于存储程序、库的标准格式
常见的Mach-O文件类型
- MH_OBJECT
目标文件(.o)
静态库文件(.a),静态库其实就是N个.o合并在一起 - MH_EXECUTE:可执行文件
.app/xx - MH_DYLIB:动态库文件
.dylib
.framework/xx - MH_DYLINKER:动态链接编辑器
/usr/lib/dyld - MH_DSYM:存储着二进制文件符号信息的文件
.dSYM/Contents/Resources/DWARF/xx(常用于分析APP的崩溃信息)
Mach-O 基本结构
一个Mach-O文件包含3个主要区域
- Header
文件类型、目标架构类型等 - Load commands
描述文件在虚拟内存中的逻辑结构,布局 - Raw segment data
在Load commands中定义的segment的原始数据

dyld和Mach-O
dyld用于加载以下类型的Mach-O文件
- MH_EXECUTE
- MH_DYLIB
- MH_BUNDLE
APP的可执行文件、动态库都是由dyld负责加载的
ASLR
Address Space Layout Randomization,地址空间布局随机化
是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目标地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术

函数的内存地址(VM Address) = File Offset + ASLR Offset + __PAGEZERO Size
签名机制
加密解密
根据密钥的使用方法,可以将密码分为2种
- 对称密码
- 公钥密码(非对称密码)
对称密码
加密解密使用的是同一个密钥
常见对称密码算法:
DES、3DES、AES

DES

DES是一种将64bit明文加密成64比特密文的对称密码算法,密钥长度是56bit
规格上来说,密钥长度是64bit,但每隔7bit会设置一个用于错误检查的bit,因此密钥长度实质上是56bit
由于DES每次加密只能加密64bit的数据,遇到比较大的数据,需要对DES加密进行迭代(反复)
目前已经可以在短时间内被破解,所以不建议使用
3DES
将DES重复3次所得到的一种密码算法,也叫做3重DES
目前还被一些银行等机构使用,但处理速度不高,安全性逐渐暴露出问题

如果所有密钥都使用同一个,则结果与普通的DES是等价的
如果密钥1、密钥3相同,密钥2不同,称为DES-EDE2
AES
取代DES成为新标准的一种对称密码算法
AES的密钥长度有128、192、256bit三种
在2000年时选择Rijindael算法作为AES的实现
目前AES,已经逐步取代DES、3DES,成为首选的对称密码算法
一般来说,我们也不应该去使用任何自制的密码算法,而是应该使用AES,它经过了全世界密码学家所进行的高品质验证工作
密钥配送问题
在使用对称密码时,一定会遇到密钥配送问题
假设,Alice将使用对称密码加密过的消息发给了Bob
只有将密钥发送给Bob,Bob才能完成解密
在发送密钥过程中,可能会被Eve窃取密钥,最后Eve也能完成解密

如何解决密钥配送问题
事先共享密钥
密钥分配中心
Diffie-Hellman密钥交换
公钥密码
公钥密码
公钥密码中,密钥分为加密密钥、解密密钥2种,它们并不是同一个密钥
公钥密码也被称为非对称密码(Asymmetric Cryptography)
在公钥密码中
加密密码一般是公开的,因此该密钥称为公钥
解密密钥,由消息接收者自己保管,不能公开,因此也称为私钥
公钥和私钥是一一对应的,不能单独生成的,一对公钥和密钥统称为密钥对
由公钥加密的密文,必须使用与该公钥对应的私钥才能解密
由私钥加密的密文,必须使用与私钥对应的公钥才能解密
解决密钥配送问题
由消息的接收者,生成一对公钥、私钥
将公钥发给消息的发送者
消息的发送者使用公钥加密消息

RSA
目前使用最广泛的公钥密码算法是RSA
RSA的名字,由它的3位开发者,即Ron Rivest、Adi Shamir、Leonard Adleman的姓氏首字母组成
混合密码系统
- 对称密码的缺点
不能很好地解决密钥配送问题 - 公钥密码的缺点
加密解密速度比较慢 - 混合密码系统,是将对称密码和公钥密码的优势相结合的方法
解决了公钥密码速度慢的问题
并通过公钥密码解决了对称密码的密钥配送问题 - 网络上的密码通信所用的SSL/TLS都运用了混合密码系统
混合密码-加密
-
会话密钥
为本次通信随机生成的临时密钥
作为对称密码的密钥,用于加密信息,提高速度 -
加密步骤(发送消息)
首先,消息发送者要拥有消息接收者的公钥
生成会话密钥,作为对称密码的密钥,加密消息
用消息接收者的公钥,加密会话密钥
将前2步生成的加密结果,一并发给消息接收者 -
发送出去的内容包括
用会话密钥加密的消息(加密方法:对称密码)
用公钥加密的会话密钥(加密方法:公钥密码)

混合密码-解密
解密步骤(收到消息)
- 消息接收者用自己的私钥解密出会话密钥
-
再用第一步解密出来的会话密钥,解密消息
image.png
单向散列函数
单向散列函数,可以根据消息内容计算出散列值
散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,单向散列函数都会计算出固定长度的散列值
单向散列函数的特点
- 根据任意长度的消息,计算出固定长度的散列值
- 计算速度快,能快速计算出散列值
- 消息不同,散列值也不同
- 具备单向性
单向散列函数
单向散列函数,又称为消息摘要函数,哈希函数
输出的散列值,也被称为消息摘要,指纹
常见的几种单向散列函数
- MD4、MD5
产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全
Mac终端上默认可以使用md5命令 - SHA-1
产生160bit的散列值,目前已经不安全 - SHA-2
SHA-256、SHA-384、SHA-512,散列值长度分别是256bit、384bit、512bit - SHA-3
全新标准
单向函数的应用
防止数据被篡改
口令加密
数字签名
在数字签名技术中,有以下两种行为
- 生成签名
由消息的发送者完成,通过“签名密钥”生成 - 验证签名
由消息的接收者完成,通过“验证密钥”验证
数字签名和公钥密码
数字签名,其实就是将公钥密码反过来使用

数字签名的过程

数字签名的过程- 改进


数字签名无法解决的问题
- 要正确使用前面,前提是
用于验证签名的公钥必须属于真正的发送者 - 如果遭遇了中间人攻击,那么
公钥将是伪造的
数字签名将失效 - 所以在验证签名之前,首先要先验证公钥的合法性
如何验证公钥的合法性 - 证书
证书
- 证书都是由权威机构认证的
密码学中的证书,全称叫公钥证书,跟驾驶证类似
里面有姓名,邮箱等个人信息,以及此人的公钥
并由认证机构施加数字签名 - CA就是能够认证公钥”确实属于此人“并能够生成数字签名的个人或者组织
有国际性组织、政府设立的机构
有通过认证服务来盈利的企业
个人也可以成立认证机构
证书的利用

iOS 签名机制
- iOS签名机制的作用
保证安装到用户手机上的app都是经过apple官方允许的 - 不管是真机调试还是发布app,开发者都需要经过一系列复杂的步骤
生成CertificateSigningRequest.certSigningRequest文件
获得ios_development.cer\ios_distribution.cer证书文件
注册device、添加App ID
获得*.mobileprovision文件 - 对于真机调试,现在的Xcode已经自动帮开发者做了以上操作
iOS签名机制 – 流程图

- CertificateSigningRequest.certSigningRequest文件
就是Mac设备的公钥 - ios_development.cer、ios_distribution.cer文件
利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件
iOS签名机制 – 安全检测

iOS签名机制 - AppStore
- 如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision文件的
-
它的验证流程会简单很多,大概如下所示
image.png
网友评论