iOS基礎(chǔ)--網(wǎng)絡(luò)安全相關(guān)總結(jié)(MD5、鑰匙串、RSA公鑰)

但愿長醉不復(fù)醒 *比比鳥*
加密解密.<思維導(dǎo)圖>

網(wǎng)絡(luò)安全


  • 相關(guān)術(shù)語

  • 密鑰: 密鑰是一種參數(shù),它是明文轉(zhuǎn)換為密文或?qū)⒚芪霓D(zhuǎn)換為明文的算法中輸入的參數(shù).密鑰分為對稱密鑰與非對稱密鑰(也可以根據(jù)用途來分為加密密鑰和解密密鑰)
  • 明文: 沒有進行加密, 能夠直接代表原文含義的信息

  • 密文: 經(jīng)過加密處理處理之后,隱藏原文含義的信息

  • 加密: 將明文轉(zhuǎn)換成密文的實施過程

  • 解密:將密文轉(zhuǎn)換成明文的實施過程

  • 數(shù)據(jù)安全: 是一種主動的包含措施,數(shù)據(jù)本身的安全必須基于可靠的加密算法與安全體系, 主要是有對稱算法與公開密鑰密碼系統(tǒng)系兩種(非對稱算法),都包含了數(shù)據(jù)的加密和解密過程.

  • 對稱算法: 對稱密碼算法有時又叫傳統(tǒng)密碼算法,是指加密碼密鑰可以從解密密鑰中推算出來,反過來也成立.


  • MD5


  • 哈希算法: 哈希算法將任意長度的二進制值映射為較短的固定長度的二進制,這個小的二進制稱為哈希值.

  • 哈希值是一段數(shù)據(jù)唯一且及其緊湊的數(shù)值表示形式, 數(shù)據(jù)的哈希值可以檢驗數(shù)據(jù)的完整性.一般用于快速查找和加密算法.

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

  • MD5: Message Digest Algorithm MD5 (消息摘要算法第五版) 為計算機安全領(lǐng)域廣泛使用的一種散列函數(shù),用以提供消息的完整性保護.

  • MD5特點:

1 、壓縮性: 任意長度的數(shù)據(jù), 算出的MD5值長度都是固定的 (16進制, 32位)
2、容易計算: 從原數(shù)據(jù)計算出MD5值很容易
3、抗修改性: 對原數(shù)據(jù)進行任何改動, 哪怕只修改 1個字節(jié) , 所得到的MD5值 都有很大區(qū)別.
4、強抗碰撞: 已知原數(shù)據(jù)和其MD5值, 想找到一個具有相同MD5值得數(shù)據(jù)(即偽數(shù)據(jù))是非常難的.

  • 小節(jié)

1: 哈希算法是一種摘要算法,主要作用是用來湖區(qū)數(shù)據(jù)的摘要.嚴格意義上來說不屬于加密算法(因為沒有解密過程)
2: 獲取字符串的MD5比較簡單,其他對象可以先轉(zhuǎn)化為NSData對象再進行操作
3: 可以根據(jù)路徑直接獲取本地數(shù)據(jù),也可以將對象寫入文件后獲取為NSData對象
4: ios同樣支持SHA1, base64, AES, 鑰匙串, 等方式加密數(shù)據(jù).


上代碼MD5

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

#pragma mark —————字符串加密
// 1: 準(zhǔn)備好一個字符串 (待加密)
NSString *string = @“就決定是你了,去吧皮卡丘";
// 2: MD5加密是基于C語言的,所以要轉(zhuǎn)化成C的字符串
const char *fooData = [string UTF8String];
// 3: 創(chuàng)建一個字符串?dāng)?shù)組,接收MD5的值
unsigned char result[CC_MD5_DIGEST_LENGTH];
//4: 計算MD5的值 //參數(shù) 1: 表示要加密的字符串
//參數(shù) 2: 獲取要加密字符串的長度
//參數(shù) 3: 接收結(jié)果的數(shù)組

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 -----------其他對象加密(先轉(zhuǎn)化成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. 創(chuàng)建MD5對象
```CC_MD5_CTX md5;```
// 2. 初始化MD5對象
`CC_MD5_Init(&md5);`
// 3. 準(zhǔn)備MD5的加密
`CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length);`
// 4. 準(zhǔn)備一個字符串?dāng)?shù)組,存儲MD5加密之后的數(shù)據(jù)
```unsigned char resuly[CC_MD5_DIGEST_LENGTH];```
// 5. 結(jié)束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中的密碼管理系統(tǒng).一個鑰匙串可以包含多種類型的數(shù)據(jù): 密碼(包含網(wǎng)站,FTP服務(wù)器,SSH賬戶, 無線網(wǎng)絡(luò), 群組軟件, 加密磁盤鏡像等), 私鑰,電子證書和加密筆記.

- 蘋果iOS和Mac OS X系統(tǒng)自帶了一套敏感信息保存方案: “鑰匙串(Keychain)"

- 鑰匙串中的條目成為Secltem, 但它是存儲在CFDictionary中的. SecltemRef類型并不存在.Secltem有五類: 通用密碼, 互聯(lián)網(wǎng)密碼, 證書, 密鑰和身份. 在大多數(shù)情況下, 我們用得到的都是通用密碼

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

- 用原生的Security.framework 就可以實現(xiàn)鑰匙串的訪問,讀寫. 但是只能在真機上進行. 通常我們使用KeychainItemWrapper來完成鑰匙串的加密.

- 不同頁面使用相同的 唯一標(biāo)識符 也能解析到 數(shù)據(jù)

##過程: 
>1、拷貝鑰匙串類到工程(引入并且在Build Phases-Compile Soirces 中給KeychainItemWrapper改成arc和mrc混編即添加-info-objc-arc)
2、引入頭文件
3、生成鑰匙串對象
4、存儲加密的數(shù)據(jù)
5、獲取鑰匙串對象
6、獲取加密的數(shù)據(jù)

---
上代碼
----
 // 1.創(chuàng)建鑰匙對象  
//參數(shù)1:表示這個鑰匙串對象的標(biāo)識符 
//參數(shù)2:分組一般為nil 
```KeychainItemWrapper*wrapper = [[KeychainItemWrapperalloc]initWithIdentifier:@"MyItemWrapper"accessGroup:nil];  ```
  //鑰匙串是類似于字典存儲的,在存儲的時候必須使用系統(tǒng)的兩個key值,其他的存不進去  
```idkUserName = (__bridgeid)kSecAttrAccount;
idkPassWord = (__bridgeid)kSecValueData; ```

//存入到鑰匙串里面 
[wrappersetObject:@"123"forKey:kUserName]
[wrappersetObject:@"abc"forKey:kPassWord];
//這里已經(jīng)保存完成了
\#pragma mark獲取鑰匙串的數(shù)據(jù) 
```code
KeychainItemWrapper*newWrapper = [[KeychainItemWrapperalloc]initWithIdentifier:@"MyItemWrapper"accessGroup:nil]; 
NSString*userName = [newWrapperobjectForKey:kUserName];
NSString*passWord = [newWrapperobjectForKey:kPassWord]; 
NSLog(@"%@ %@",userName,passWord);```

----
RSA公鑰加密
-----
//公鑰和私鑰都是使用證書生成的, 并非我們自定義字符串就可以.我們使用的是生成好的公鑰和私鑰
  //其中-----BEGIN PUBLIC KEY----- 開頭結(jié)尾之類不屬于密鑰部分
//公鑰,用于加密數(shù)據(jù). 用于公開, 一般存放在數(shù)據(jù)提供方, 例如iOS客戶端. 
```NSString *pubkey = @"公鑰"; ```
/私鑰,用于解密數(shù)據(jù). 必須保密, 私鑰泄露會造成安全問題.
```NSString *privkey = @"私鑰";
NSString *string = @"James"; 
NSString *encPubKey;```//公鑰加密結(jié)果 
```NSString *decPriKey;```//私鑰解密結(jié)果       
//使用RSA加密(RSA加密之后得到的結(jié)果每一次都不一樣,但都可以通過同一個私鑰進行解密)
//參數(shù) 1: 要加密的數(shù)據(jù) 
//參數(shù) 2: 公鑰 
```encPubKey = [RSA encryptString:string publicKey:pubkey];
NSLog(@"encPubKey --> %@",encPubKey);
decPriKey = [RSA decryptString:encPubKey privateKey:privkey]; 
NSLog(@"decPriKey --> %@",decPriKey);```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容