

網(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);```