一、常用術語
- 密鑰:密鑰是一種參數,它是在明文轉換為密文或將密文轉換為明文的算法中輸入的參數。密鑰分為對稱密鑰與非對稱秘鑰。
- 明文:沒有進行加密,能夠直接代表原文含義的信息
- 密文:經過加密處理之后,隱藏原文含義的信息
- 加密:將明文轉換成密文的實施過程
- 解密:將密文轉換成明文的實施過程
二、MD5
MD5:名為消息摘要算法第五版,為計算機安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護。
MD5算法的特點:
- 壓縮性:任意長度的數據,算出的MD5值長度都是固定的128位 二進制,32位 十六進制。
- 容易計算:從原數據計算出MD5值很容易。
- 抗修改性:對源數據進行任何改動,哪怕只改一個字節,所得到的MD5值都有很大差別。
- 強抗碰撞:已知源數據及其MD5值,想找到一個具有相同MD5值的數據是非常困難的。
使用MD5加密時,首先要引入<CommonCrypto/CommonCrypto.h>頭文件,在進行如下操作,例如對NSString類型進行加密
#import <CommonCrypto/CommonCrypto.h>//加密相關的頭文件
//MD5對字符串進行加密 128位的二進制, 32位 十六進制
-(void)md5MethodWithSourceingString:(NSString*)sourceString{
//用的是c語言的函數進行的加密,所以我們需要將字符串轉換為c語言字符串
const char* str = sourceString.UTF8String;
//聲明一個c語言的字符數組用來存放加密之后的所有字符
unsigned char result[CC_MD5_DIGEST_LENGTH];
//MD5加密
//第一個參數:要加密的源字符串
//第二個參數:要加密的字符串的長度
//第三個參數:用來接收加密好的字符的容器
CC_MD5(str, (CC_LONG)strlen(str), result);
//將加密好的字符數組中的字符轉為16進制的字符串以供使用
NSMutableString* resultStr=[[NSMutableString alloc] init];
for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
//將c語言字符轉換為16進制的字符串
[resultStr appendFormat:@"%02x",result[i]];
}
NSLog(@"md5----%@",resultStr);
}
使用MD5對NSData類型的數據進行加密,例如加密圖片
//用MD5對NSData類型進行加密
-(void)md5WithsourceData:(NSData*)sourceData{
//創建MD5變量
CC_MD5_CTX md5;
//初始化MD5變量
CC_MD5_Init(&md5);
//準備MD5加密
//第一個參數就是MD5變量取地址
//第二個參數就是要進行加密的數據 bytes是將NSData轉換為c語言的二進制類型
//第三個參數就是數據長度
CC_MD5_Update(&md5, sourceData.bytes, (CC_LONG)sourceData.length);
//結束MD5加密
// 接收加密好的數據容器
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(result, &md5);
NSMutableString* resultStr=[[NSMutableString alloc] init];
for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02X",result[i]];
}
NSLog(@"MD5png-------%@",resultStr);
}
三、SHA-1
SHA1安全散列算法(英語:Secure Hash Algorithm)是一種能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。由美國國家安全局(NSA)所設計,并由美國國家標準與技術研究院(NIST)發布;是美國的政府標準。曾被視為是MD5(更早之前被廣為使用的散列函數)的后繼者。
例如SHA-1對字符串進行加密
//SHA-1加密 160位 二進制 40位 十六進制
-(void)shaMethodWithSourceingString:(NSString*)sourceString{
//用的是c語言的函數進行的加密,所以我們需要將字符串轉換為c語言字符串
const char* str = sourceString.UTF8String;
//聲明一個c語言的字符數組用來存放加密之后的所有字符
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(str, (CC_LONG)strlen(str), result);
NSMutableString* resultStr=[[NSMutableString alloc] init];
for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02x",result[i]];
}
NSLog(@"sha-1-------%@",resultStr);
}
SHA-1對NSData類型的數據進行加密,這里加密圖片
//用SHA-1對NSData類型進行加密
-(void)shaWithsourceData:(NSData*)sourceData{
//創建MD5變量
CC_SHA1_CTX sha;
//初始化MD5變量
CC_SHA1_Init(&sha);
//準備MD5加密
CC_SHA1_Update(&sha, sourceData.bytes, (CC_LONG)sourceData.length);
//結束MD5加密
unsigned char result[CC_SHA1_DIGEST_LENGTH];
//結束加密
CC_SHA1_Final(result, &sha);
NSMutableString* resultStr=[[NSMutableString alloc] init];
for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02X",result[i]];
}
NSLog(@"SHApng-------%@",resultStr);
}
四、鑰匙串加密
鑰匙串(英文:Keychain)是蘋果公司Mac OS中的密碼管理系統。它在Mac OS 8.6中被導入,并且包括在了所有后續的Mac OS版本中,包括Mac OS X。一個鑰匙串可以包含多種類型的數據:密碼(包括網站,FTP服務器,SSH帳戶,網絡共享,無線網絡,群組軟件,加密磁盤鏡像等),私鑰,電子證書和加密筆記等。KeyChain是一種對稱加密
(1)首先拖入KeychainItemWrapper的.m和.h文件
(2)在工程的Build Phases設置的Compile Sources下給KeychainItemWrapper.m后面加上-fno-objc-arc,讓這個非arc的類可以在arc工程下編譯
(3)在Link Binary With Libraries下面加上Security.framework
Snip20161221_1.png
接下來進行加密就可以了
//鑰匙串加密
//一般用在保存我們不希望發生變化的數據,例如應用程序的UUID,在iOS7之后,我們將應用程序卸載重裝,應用程序的UUID可能會發生變化,我們不希望它一直變化,就可以將UUID存儲在鑰匙串中
-(void)keychain{
//初始化工具類
//第一個參數:當前工具的標識符,為了取值的時候,可以根據標識符找到對應的工具
//第二個參數:一般填工程的唯一標識符,一般是用來區分是哪個工程所保存的數據
KeychainItemWrapper* key=[[KeychainItemWrapper alloc] initWithIdentifier:@"yf" accessGroup:@"com.xalo.Test-01.Senior-secret-YF"];
//存儲用戶名和密碼
//使用和字典基本一致,但是key必須使用系統提供的,不能自己定義
[key setObject:@"用戶名" forKey:(__bridge id)kSecAttrAccount];
[key setObject:@"密碼" forKey:(__bridge id)kSecValueData];
//清除鑰匙串中存儲的數據
// [key resetKeychainItem];
NSString* userName= [key objectForKey:(__bridge id)kSecAttrAccount];
NSLog(@"%@",userName);
NSString* passWord= [key objectForKey:(__bridge id)kSecValueData];
NSLog(@"%@",passWord);
}