网络安全
- 术语:
- 密钥: 密钥是一种参数,它是明文转换为密文或将密文转换为明文的算法中输入的参数.密钥分为对称密钥与非对称密钥(也可以根据用途来分为加密密钥和解密密钥)
- 明文: 没有进行加密, 能够直接代表原文含义的信息
- 密文: 经过加密处理处理之后,隐藏原文含义的信息
- 加密: 将明文转换成密文的实施过程
- 解密:将密文转换成明文的实施过程
数据安全: 是一种主动的包含措施,数据本身的安全必须基于可靠的加密算法与安全体系, 主要是有对称算法与公开密钥密码系统系两种(非对称算法),都包含了数据的加密和解密过程.
对称算法: 对称密码算法有时又叫传统密码算法,是指加密码密钥可以从解密密钥中推算出来,反过来也成立.
MD5
哈希算法: 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制,这个小的二进制称为哈希值.
哈希值是一段数据唯一且及其紧凑的数值表示形式, 数据的哈希值可以检验数据的完整性.一般用于快速查找和加密算法.
典型的哈希算法有: MD2, MD4, MD5, 和SHA-1等.
MD5: Message Digest Algorithm MD5 (消息摘要算法第五版) 为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.
MD5特点:
- 压缩性: 任意长度的数据, 算出的MD5值长度都是固定的 (16进制, 32位)
- 容易计算: 从原数据计算出MD5值很容易
- 抗修改性: 对原数据进行任何改动, 哪怕只修改 1个字节 , 所得到的MD5值 都有很大区别.
- 强抗碰撞: 已知原数据和其MD5值, 想找到一个具有相同MD5值得数据(即伪数据)是非常难的.
- 小节
- 哈希算法是一种摘要算法,主要作用是用来湖区数据的摘要.严格意义上来说不属于加密算法(因为没有解密过程)
- 获取字符串的MD5比较简单,其他对象可以先转化为NSData对象再进行操作
- 可以根据路径直接获取本地数据,也可以将对象写入文件后获取为NSData对象
- ios同样支持SHA1, base64, AES, 钥匙串, 等方式加密数据.
#import
"ViewController.h"
// 首先引入框架
#import
@interface ViewController ()
@end
@implementation ViewController
- ( void )viewDidLoad {
@interface ViewController ()
@end
@implementation ViewController
- ( void )viewDidLoad {
#pragma mark —————字符串加密
#pragma mark -----------其他对象加密(先转化成NSData)
}
@end
钥匙串加密
- 钥匙串(Keychain):是苹果公司Mac OS中的密码管理系统.一个钥匙串可以包含多种类型的数据: 密码(包含网站,FTP服务器,SSH账户, 无线网络, 群组软件, 加密磁盘镜像等), 私钥,电子证书和加密笔记.
- 苹果iOS和Mac OS X系统自带了一套敏感信息保存方案:
“钥匙串(Keychain)" - 钥匙串中的条目成为Secltem, 但它是存储在CFDictionary中的. SecltemRef类型并不存在.Secltem有五类: 通用密码, 互联网密码, 证书, 密钥和身份. 在大多数情况下, 我们用得到的都是通用密码
- 钥匙串的使用和字典非常的相似
- 用原生的Security.framework 就可以实现钥匙串的访问,读写. 但是只能在真机上进行. 通常我们使用KeychainItemWrapper来完成钥匙串的加密.
注:不同页面使用相同的 唯一标识符 也能解析到 数据
例子:
过程:
- 拷贝钥匙串类到工程
- 引入头文件
- 生成钥匙串对象
- 存储加密的数据
- 获取钥匙串对象
- 获取加密的数据
#import
"ViewController.h"
#import "KeychainItemWrapper.h"
@interface ViewController ()
@end
@implementation ViewController
- ( void )viewDidLoad {
[
super
viewDidLoad
];
// 1.
创建钥匙对象
//
参数
1:
表示这个钥匙串对象的标识符
//
参数
2:
分组
一般为
nil
KeychainItemWrapper
*wrapper = [[
KeychainItemWrapper
alloc
]
initWithIdentifier
:
@"MyItemWrapper"
accessGroup
:
nil
];
//
钥匙串是类似于字典存储的
,
在存储的时候
必须使用系统的两个
key
值
,
其他的存不进去
id
kUserName = (
__bridge
id
)
kSecAttrAccount
;
id
kPassWord = (
__bridge
id
)
kSecValueData
;
//
存入到钥匙串里面
[wrapper
setObject
:
@"123"
forKey
:kUserName];
[wrapper
setObject
:
@"abc"
forKey
:kPassWord];
//
这里已经保存完成了
#pragma mark 获取钥匙串的数据
KeychainItemWrapper
*newWrapper = [[
KeychainItemWrapper
alloc
]
initWithIdentifier
:
@"MyItemWrapper"
accessGroup
:
nil
];
NSString
*userName = [newWrapper
objectForKey
:kUserName];
NSString
*passWord = [newWrapper
objectForKey
:kPassWord];
NSLog
(
@"%@ %@"
,userName,passWord);
}
#import "KeychainItemWrapper.h"
@interface ViewController ()
@end
@implementation ViewController
- ( void )viewDidLoad {
#pragma mark 获取钥匙串的数据
}
@end
RSA公钥加密
#import
"ViewController.h"
#import "RSA.h"
@interface ViewController ()
@end
@implementation ViewController
- ( void )viewDidLoad {
#import "RSA.h"
@interface ViewController ()
@end
@implementation ViewController
- ( void )viewDidLoad {
}
@end
KVO
KVO(Key-Value-Observer) 键值观察者:是观察者设计模式的一种具体实现
KVO激发机制: 一个对象(观察者), 检测另一个对象(被观察者)的某属性是否发生变化, 若被检测的属性发生的更改, 会触发观察者的一个方法 (方法名固定, 类似代理方法)
KVO步骤:
- 注册观察者 (为被观察者指定观察者以及被观察的属性)
- 实现回调方法
- 触发回调方法(被观察属性发生更改)
- 移除观察者
KVO以及NotificationCenter通常是用于M和V通信. 是实际开发中的必不可少的技能
#import
"ViewController.h"
@interface
ViewController
()
@property ( nonatomic , strong ) NSMutableArray *array;
@property ( nonatomic , strong ) NSMutableArray *array;
@end
@implementation
ViewController
- (
void
)viewDidLoad {
[
super
viewDidLoad
];
//
添加一个观察者
//
参数
1:
被观察着
//
参数
2:
哪一个属性
//
参数
3:
触发方式
//
参数
4:
保险
,
可以添加些字符串
(
一般为
nil)
[
self
addObserver
:
self
forKeyPath
:
@"array"
options
:
NSKeyValueObservingOptio nNew
context
:
nil
];
//
谁去观察谁的哪一个属性
,
检查它变化的时间
}
- ( void )touchesBegan:( NSSet <</span>UITouch *> *)touches withEvent:(UIEvent *)event{
self.array = [NSMutableArrayarray];
NSArray *array = @[@"1",@"2"];
[[selfmutableArrayValueForKeyP ath:@"array"]setArray:array];
}
//触发的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<</span>NSString *,id> *)change context:(void *)context{
NSLog(@"keyPaht --> %@",keyPath);
NSLog(@"object --> %@",object);
NSLog(@"change --> %@",change);
}
- (void)dealloc{
//写了KVO一定要写这个移除观察者的方法
[selfremoveObserver:selfforKeyPath:@"array"];
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
}
- ( void )touchesBegan:( NSSet <</span>UITouch *> *)touches withEvent:(UIEvent *)event{
}
//触发的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<</span>NSString *,id> *)change context:(void *)context{
}
- (void)dealloc{
}
- (void)didReceiveMemoryWarning {
}
@end