iOS开发中的加密方式
iOS加密相关算法框架:CommonCrypto
。
1:对称加密: DES、3DES、AES
AES:AES又称高级加密标准,是下一代的加密算法标准,支持128、192、256位密钥的加密,加密和解密的密钥都是同一个。iOS一般使用ECB模式,16字节128位密钥。
AES算法主要包括三个方面:轮变化、圈数和密钥扩展。
DES:数据加密标准,DES算法的入口参数有三个:Key
、Data
、Mode
。
3DES:3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。是DES向AES过渡的加密算法,是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。
2.非对称加密:RSA加密
公钥加密,私钥解密;或者私钥数字签名,公钥验证。公钥和私钥是成对的,它们互相解密。
3. 哈希算法加密:MD5加密
、.SHA加密
、HMAC加密
MD5加密:对不同的数据加密的结果都是定长的32位字符。
.SHA加密:安全哈希算法,主要适用于数字签名标准(DSS
)里面定义的数字签名算法(DSA)。对于长度小于2^64
位的消息,SHA1
会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。当然除了SHA1
还有SHA256
以及SHA512
等。
HMAC加密:给定一个密钥,对明文加密,做两次“散列”,得到的结果还是32位字符串。
4. Base64加密
App安全,数字签名,App签名,重签名
因为应用实际上是一个加壳的ipa文件,但是有可能被砸壳甚至越狱手机下载的ipa包直接就是脱壳的,可以直接反编译,所以不要在plist文件
、项目中的静态文件
中存储关键的信息。所以敏感信息对称加密存储或者就存储到keychain
里。而且加密密钥也要定期更换。
数字签名是通过HASH算法
和RSA加密
来实现的。 我们将明文数据加上通过RSA加密
的数据HASH值
一起传输给对方,对方可以解密拿出HASH值
来进行验证。这个通过RSA加密HASH值
数据,我们称之为数字签名。
App签名
OC数据类型
① 基本数据类型
② 指针数据类型
指针数据类型包括: 类class
、id
。
集合NSSet和数组NSArray区别:
③ 构造类型
构造类型包括:结构体、联合体
结构体和联合体的区别:
分配,会造成内存浪费。
property和属性修饰符
@property的本质是 ivar(实例变量)
+ setter
+ getter
.
我们每次增加一个属性时内部都做了什么:
- 5.给出
setter
与getter
方法对应的实现,在setter
方法中从偏移量的位置开始赋值,在getter
方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转。
修饰符:
下面分别解释
后四个属性应该主要就是为了提高开发规范,提示使用的人应该传什么样的值,如果违反了对规范值的要求,就会有警告。
weak修饰的对象释放则自动被置为nil的实现原理:
Runtime
维护了一个weak表
,存储指向某个对象的所有weak指针
。weak表
其实是一个hash(哈希)表
,Key
是所指对象的地址,Value
是weak
指针的地址数组(这个地址的值是所指对象的地址)。
weak 的实现原理可以概括一下三步:
成员变量ivar
和属性property
的区别,以及不同关键字的作用
成员变量: 成员变量的默认修饰符是@protected
、不会自动生成set和get方法,需要手动实现、不能使用点语法调用,因为没有set和get方法,只能使用->
。
属性: 属性会默认生成带下划线的成员变量和setter/getter
方法、可以用点语法调用,实际调用的是set和get方法。
注意:分类中添加的属性是不会自动生成 **setter/getter**
方法的,必须要手动添加。
实例变量: class类进行实例化出来的对象为实例对象
关键字作用:
类簇
类簇是Foundation框架中广泛使用的设计模式。类簇在公共抽象超类下对多个私有的具体子类进行分组。以这种方式对类进行分组简化了面向对象框架的公共可见体系结构,而不会降低其功能丰富度。类簇是基于抽象工厂设计模式的。
常见的类簇有 NSString
、NSArray
、NSDictionary
等。 以数组为例:不管创建的是可变还是不可变的数组,在alloc
之后得到的类都是 __NSPlaceholderArray
。而当我们 init
一个不可变的空数组之后,得到的是 __NSArray0
;如果有且只有一个元素,那就是 __NSSingleObjectArrayI
;有多个元素的,叫做 __NSArrayI
;init
出来一个可变数组的话,都是 __NSArrayM
。
我们运用类簇的场景:
- 出现 bug 时,可以通过崩溃报告中的类簇关键字,快速定位 bug 位置。
- 在实现一些固定且并不需要经常修改的事物时,可以高效的选择类簇去实现。例: