网络安全


网络安全


  • 术语:
  1. 密钥: 密钥是一种参数,它是明文转换为密文或将密文转换为明文的算法中输入的参数.密钥分为对称密钥与非对称密钥(也可以根据用途来分为加密密钥和解密密钥)
  2. 明文: 没有进行加密, 能够直接代表原文含义的信息
  3. 密文: 经过加密处理处理之后,隐藏原文含义的信息
  4. 加密: 将明文转换成密文的实施过程
  5. 解密:将密文转换成明文的实施过程

数据安全: 是一种主动的包含措施,数据本身的安全必须基于可靠的加密算法与安全体系, 主要是有对称算法与公开密钥密码系统系两种(非对称算法),都包含了数据的加密和解密过程.

对称算法: 对称密码算法有时又叫传统密码算法,是指加密码密钥可以从解密密钥中推算出来,反过来也成立.

MD5


哈希算法: 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制,这个小的二进制称为哈希值.

哈希值是一段数据唯一且及其紧凑的数值表示形式, 数据的哈希值可以检验数据的完整性.一般用于快速查找和加密算法.

典型的哈希算法有: MD2, MD4, MD5, 和SHA-1等.

MD5: Message Digest Algorithm MD5 (消息摘要算法第五版) 为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.

MD5特点: 
  1. 压缩性: 任意长度的数据, 算出的MD5值长度都是固定的 (16进制, 32位)
  2. 容易计算: 从原数据计算出MD5值很容易
  3. 抗修改性: 对原数据进行任何改动, 哪怕只修改 1个字节 , 所得到的MD5值 都有很大区别.
  4. 强抗碰撞: 已知原数据和其MD5值, 想找到一个具有相同MD5值得数据(即伪数据)是非常难的.

  • 小节
  1. 哈希算法是一种摘要算法,主要作用是用来湖区数据的摘要.严格意义上来说不属于加密算法(因为没有解密过程)
  2. 获取字符串的MD5比较简单,其他对象可以先转化为NSData对象再进行操作
  3. 可以根据路径直接获取本地数据,也可以将对象写入文件后获取为NSData对象
  4. ios同样支持SHA1, base64, AES, 钥匙串, 等方式加密数据.

#import "ViewController.h"

// 首先引入框架
#import
@interface
ViewController ()

@end

@implementation ViewController

- (
void )viewDidLoad {
    [super viewDidLoad ];
#pragma mark —————字符串加密
    // 1: 准备好一个字符串
   
NSString *string = @" 世界如此美好 , 不应如此暴躁 " ;
   
// 2: MD5 加密是基于 C 语言的 , 所以要转化成 C 的字符串
   
const char *fooData = [string UTF8String ];
   
// 3: 创建一个字符串数组 , 接收 MD5 的值
   
unsigned char result[ CC_MD5_DIGEST_LENGTH ];
   
// 4: 计算 MD5 的值
   
// 参数 1: 表示要加密的字符串
   
// 参数 2: 获取要加密字符串的长度
   
// 参数 3: 接收结果的数组
   
CC_MD5 (fooData, ( CC_LONG ) strlen (fooData), result);
   
   
NSMutableString *resultString = [ NSMutableString string ];
   
for ( int i = 0; i <</span> CC_MD5_DIGEST_LENGTH; i++) {
        [resultString
appendFormat:@"X",result[i]];
    }
   
NSLog(@"resultString --> %@",resultString);
  
#pragma mark -----------其他对象加密(先转化成NSData)
    //
   
NSArray *array = @[ @"1" , @"2" ];
   
   
NSString *documentsPathStr = [ NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory , NSUserDomainMask , YES ) objectAtIndex :0];
   
NSString *path = [documentsPathStr stringByAppendingPathComponent : @"array.plist" ];
    [array
writeToFile :path atomically : YES ];
   
   
NSData *data = [ NSData dataWithContentsOfFile :path];
   
   
// 1. 创建 MD5 对象
   
CC_MD5_CTX md5;
   
// 2. 初始化 MD5 对象
   
CC_MD5_Init (&md5);
   
// 3. 准备 MD5 的加密
   
CC_MD5_Update (&md5, data. bytes , ( CC_LONG )data. length );
   
// 4. 准备一个字符串数组 , 存储 MD5 加密之后的数据
   
unsigned char resuly[ CC_MD5_DIGEST_LENGTH ];
   
// 5. 结束 MD5 的加密
   
CC_MD5_Final (resuly, &md5);
   
   
NSMutableString *resulyString = [ NSMutableString string ];
   
for ( int i = 0; i <</span> CC_MD5_DIGEST_LENGTH; i++) {
        [resultString
appendFormat:@"X",resuly[i]];
    }
   
NSLog(@"%@", resulyString);
}
@end




钥匙串加密

  • 钥匙串(Keychain):是苹果公司Mac OS中的密码管理系统.一个钥匙串可以包含多种类型的数据: 密码(包含网站,FTP服务器,SSH账户, 无线网络, 群组软件, 加密磁盘镜像等), 私钥,电子证书和加密笔记.

  • 苹果iOS和Mac OS X系统自带了一套敏感信息保存方案: “钥匙串(Keychain)"

  • 钥匙串中的条目成为Secltem, 但它是存储在CFDictionary中的. SecltemRef类型并不存在.Secltem有五类: 通用密码, 互联网密码, 证书, 密钥和身份. 在大多数情况下, 我们用得到的都是通用密码

  • 钥匙串的使用和字典非常的相似

  • 用原生的Security.framework 就可以实现钥匙串的访问,读写. 但是只能在真机上进行. 通常我们使用KeychainItemWrapper来完成钥匙串的加密.

注:不同页面使用相同的 唯一标识符 也能解析到 数据
例子:
过程: 
  1. 拷贝钥匙串类到工程
  2. 引入头文件
  3. 生成钥匙串对象
  4. 存储加密的数据
  5. 获取钥匙串对象
  6. 获取加密的数据
网络安全

#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);
   
}

@end



RSA公钥加密



#import "ViewController.h"

#import "RSA.h"
@interface
ViewController ()

@end

@implementation ViewController

- (
void )viewDidLoad {
    [superviewDidLoad];
         // 公钥和私钥都是使用证书生成的 , 并非我们自定义字符串就可以 . 我们使用的是生成好的公钥和私钥
    //其中-----BEGIN PUBLIC KEY----- 开头结尾之类不属于密钥部分

    // 公钥 , 用于加密数据 . 用于公开 , 一般存放在数据提供方 , 例如 iOS 客户端 .
   
   
NSString *pubkey = @"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEChqe80lJLTTkJD3X3Lyd7Fj+\nzuOhDZkjuLNPog3YR20e5JcrdqI9IFzNbACY/GQVhbnbvBqYgyql8DfPCGXpn0+X\nNSxELIUw9Vh32QuhGNr3/TBpechrVeVpFPLwyaYNEk1CawgHCeQqf5uaqiaoBDOT\nqeox88Lc1ld7MsfggQIDAQAB\n-----END PUBLIC KEY-----" ;
   
   
// 私钥 , 用于解密数据 . 必须保密 , 私钥泄露会造成安全问题 .
   
   
NSString *privkey = @"-----BEGIN RSA PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMQKGp7zSUktNOQk\nPdfcvJ3sWP7O46ENmSO4s0+iDdhHbR7klyt2oj0gXM1sAJj8ZBWFudu8GpiDKqXw\nN88IZemfT5c1LEQshTD1WHfZC6EY2vf9MGl5yGtV5WkU8vDJpg0STUJrCAcJ5Cp/\nm5qqJqgEM5Op6jHzwtzWV3syx+CBAgMBAAECgYEApSzqPzE3d3uqi+tpXB71oY5J\ncfB55PIjLPDrzFX7mlacP6JVKN7dVemVp9OvMTe/UE8LSXRVaFlkLsqXC07FJjhu\nwFXHPdnUf5sanLLdnzt3Mc8vMgUamGJl+er0wdzxM1kPTh0Tmq+DSlu5TlopAHd5\nIqF3DYiORIen3xIwp0ECQQDj6GFaXWzWAu5oUq6j1msTRV3mRZnx8Amxt1ssYM0+\nJLf6QYmpkGFqiQOhHkMgVUwRFqJC8A9EVR1eqabcBXbpAkEA3DQfLVr94vsIWL6+\nVrFcPJW9Xk28CNY6Xnvkin815o2Q0JUHIIIod1eVKCiYDUzZAYAsW0gefJ49sJ4Y\niRJN2QJAKuxeQX2s/NWKfz1rRNIiUnvTBoZ/SvCxcrYcxsvoe9bAi7KCMdxObJkn\nhNXFQLav39wKbV73ESCSqnx7P58L2QJABmhR2+0A5EDvvj1WpokkqPKmfv7+ELfD\nHQq33LvU4q+N3jPn8C85ZDedNHzx57kru1pyb/mKQZANNX10M1DgCQJBAMKn0lEx\nQH2GrkjeWgGVpPZkp0YC+ztNjaUMJmY5g0INUlDgqTWFNftxe8ROvt7JtUvlgtKC\nXdXQrKaEnpebeUQ=\n-----END RSA PRIVATE KEY-----" ;
   
   
NSString *string = @" 王梁 " ;
   
   
NSString *encPubKey; // 公钥加密结果
   
NSString *decPriKey; // 私钥解密结果
   
   
// 使用 RSA 加密 (RSA 加密之后得到的结果每一次都不一样 , 但都可以通过同一个私钥进行解密 )
   
// 参数 1: 要加密的数据
   
// 参数 2: 公钥
    encPubKey = [
RSA encryptString :string publicKey :pubkey];
   
   
NSLog ( @"encPubKey --> %@" ,encPubKey);
   
    decPriKey = [
RSA decryptString :encPubKey privateKey :privkey];
   
   
NSLog ( @"decPriKey --> %@" ,decPriKey);
   
}

@end



KVO

KVO(Key-Value-Observer) 键值观察者:是观察者设计模式的一种具体实现

KVO激发机制: 一个对象(观察者), 检测另一个对象(被观察者)的某属性是否发生变化, 若被检测的属性发生的更改, 会触发观察者的一个方法 (方法名固定, 类似代理方法)
 
KVO步骤: 
  1. 注册观察者 (为被观察者指定观察者以及被观察的属性)
  2. 实现回调方法
  3. 触发回调方法(被观察属性发生更改)
  4. 移除观察者

KVO以及NotificationCenter通常是用于M和V通信. 是实际开发中的必不可少的技能

#import "ViewController.h"
@interface ViewController ()

@property ( nonatomic , strong ) NSMutableArray *array;

@end
@implementation ViewController
- ( void )viewDidLoad {
    [
super viewDidLoad ];
   
// 添加一个观察者
   
// 参数 1: 被观察着
   
// 参数 2: 哪一个属性
   
// 参数 3: 触发方式
   
// 参数 4: 保险 , 可以添加些字符串 ( 一般为 nil)
    [
self addObserver : self forKeyPath : @"array" options : NSKeyValueObservingOptionNew context : nil ]; // 谁去观察谁的哪一个属性 , 检查它变化的时间
}

- (
void )touchesBegan:( NSSet <</span>UITouch *> *)touches withEvent:(UIEvent *)event{
   
self.array = [NSMutableArrayarray];
   
NSArray *array = @[@"1",@"2"];
   
    [[
selfmutableArrayValueForKeyPath:@"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.
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值