iOS基础--网络安全相关总结(MD5、钥匙串、RSA公钥)

但愿长醉不复醒 *比比鸟*
加密解密.<思维导图>

网络安全


  • 相关术语

  • 密钥: 密钥是一种参数,它是明文转换为密文或将密文转换为明文的算法中输入的参数.密钥分为对称密钥与非对称密钥(也可以根据用途来分为加密密钥和解密密钥)
  • 明文: 没有进行加密, 能够直接代表原文含义的信息

  • 密文: 经过加密处理处理之后,隐藏原文含义的信息

  • 加密: 将明文转换成密文的实施过程

  • 解密:将密文转换成明文的实施过程

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

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


  • 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, 钥匙串, 等方式加密数据.


上代码MD5

// 首先引入框架
#import <CommonCrypto/CommonCrypto.h>

#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 < CC_MD5_DIGEST_LENGTH; i++) {
[resultString appendFormat:@"%02X",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的加密 
```code
CC_MD5_Final(resuly, &md5);
NSMutableString *resulyString = [NSMutableString string];   
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) 
{ [resultString appendFormat:@"%02X",resuly[i]];
}    NSLog(@"%@", resulyString);
}```

----
钥匙串加密
----

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

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

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

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

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

- 不同页面使用相同的 唯一标识符 也能解析到 数据

##过程: 
>1、拷贝钥匙串类到工程(引入并且在Build Phases-Compile Soirces 中给KeychainItemWrapper改成arc和mrc混编即添加-info-objc-arc)
2、引入头文件
3、生成钥匙串对象
4、存储加密的数据
5、获取钥匙串对象
6、获取加密的数据

---
上代码
----
 // 1.创建钥匙对象  
//参数1:表示这个钥匙串对象的标识符 
//参数2:分组一般为nil 
```KeychainItemWrapper*wrapper = [[KeychainItemWrapperalloc]initWithIdentifier:@"MyItemWrapper"accessGroup:nil];  ```
  //钥匙串是类似于字典存储的,在存储的时候必须使用系统的两个key值,其他的存不进去  
```idkUserName = (__bridgeid)kSecAttrAccount;
idkPassWord = (__bridgeid)kSecValueData; ```

//存入到钥匙串里面 
[wrappersetObject:@"123"forKey:kUserName]
[wrappersetObject:@"abc"forKey:kPassWord];
//这里已经保存完成了
\#pragma mark获取钥匙串的数据 
```code
KeychainItemWrapper*newWrapper = [[KeychainItemWrapperalloc]initWithIdentifier:@"MyItemWrapper"accessGroup:nil]; 
NSString*userName = [newWrapperobjectForKey:kUserName];
NSString*passWord = [newWrapperobjectForKey:kPassWord]; 
NSLog(@"%@ %@",userName,passWord);```

----
RSA公钥加密
-----
//公钥和私钥都是使用证书生成的, 并非我们自定义字符串就可以.我们使用的是生成好的公钥和私钥
  //其中-----BEGIN PUBLIC KEY----- 开头结尾之类不属于密钥部分
//公钥,用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端. 
```NSString *pubkey = @"公钥"; ```
/私钥,用于解密数据. 必须保密, 私钥泄露会造成安全问题.
```NSString *privkey = @"私钥";
NSString *string = @"James"; 
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);```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容