在今天的面試中,被問到了iOS是采用什么進行加密解密操作的,我的回答是這樣的:AES,MD5,Base 64,然后是對這幾種加密算法進行了一下簡單的介紹和概述和幾種算法之間的不同點和優缺點。然而,收到的回答是:這些都不是iOS的加密!我頓時就無語了,這不就是iOS加密所用到的方法么?然后向面試官請教了一下:MD5是一種摘要。。。。什么叫加密呢?加密是客戶端對數據加密和服務器端采用秘鑰對數據進行解密處理,為了數據的安全考慮。要說加密應該是RSA。幸虧之前有了解過RSA,只是了解的不是很徹底和清楚。。。。。。
回來還是對iOS的加密解密持有一種懷疑的態度,還是自己網上找找資料學習學習吧!
iOS代碼加密常用加密方式,常見的iOS代碼加密常用加密方式算法包括MD5加密、AES加密、BASE64加密:
-
MD5 iOS代碼加密
創建MD5類,代碼如下
#import <Foundation/Foundation.h>
@interface CJMD5 : NSObject
+(NSString *)md5HexDigest:(NSString *)input;
@end
-
#import "CJMD5.h"
#import <CommonCrypto/CommonDigest.h>
@implementation CJMD5
+(NSString *)md5HexDigest:(NSString *)input{
const char* str = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, strlen(str), result);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
[ret appendFormat:@"%02X",result];
}
return ret;
}
@end
-
MD5是不可逆的只有加密沒有解密,iOS代碼加密使用方式如下
NSString *userName = @"cerastes";
NSString *password = @"hello Word";
// MD5加密
NSString *md5 = [CJMD5 md5HexDigest:password];
NSLog(@"%@",md5);
END
AES加密iOS代碼加密
-
AES加密iOS代碼加密使用方法
// AES加密
NSString *encryptedData = [AESCrypt encrypt:userName password:password];//加密
NSString *message = [AESCrypt decrypt:encryptedData password:password]; //解密
NSLog(@"加密結果 = %@",encryptedData);
NSLog(@"解密結果 = %@",message);
END
BASE64加密iOS代碼加密
-
BASE64加密iOS代碼加密添加如下方法
.h
+ (NSString*)encodeBase64String:(NSString *)input;
+ (NSString*)decodeBase64String:(NSString *)input;
+ (NSString*)encodeBase64Data:(NSData *)data;
+ (NSString*)decodeBase64Data:(NSData *)data;
-
.m
+ (NSString*)encodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
}
+ (NSString*)decodeBase64String:(NSString * )input {
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
data = [GTMBase64 decodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
}
+ (NSString*)encodeBase64Data:(NSData *)data {
data = [GTMBase64 encodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
}
+ (NSString*)decodeBase64Data:(NSData *)data {
data = [GTMBase64 decodeData:data];
NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return base64String;
}
-
BASE64加密iOS代碼加密使用方法
// BASE64加密
NSString *baseEncodeString = [GTMBase64 encodeBase64String:password];
NSString *baseDecodeString = [GTMBase64 decodeBase64String:baseEncodeString];
NSLog(@"baseEncodeString = %@",baseEncodeString);
NSLog(@"baseDecodeString = %@",baseDecodeString);
4.RSA加密:
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標准。
RSA公開密鑰密碼體制。所謂的公開密鑰密碼體制就是使用不同的加密密鑰與解密密鑰,是一種“由已知加密密鑰推導出解密密鑰在計算上是不可行的”密碼體制。
通常是先生成一對RSA 密鑰,其中之一是保密密鑰,由用戶保存;另一個為公開密鑰,可對外公開,甚至可在 網絡服務器中注冊。為提高保密強度,RSA密鑰至少為500位長,一般推薦使用1024位。這就使加密的計算量很大。為減少計算量,在傳送信息時,常采用傳統加密方法與 公開密鑰加密方法相結合的方式,即信息采用改進的DES或IDEA對話密鑰加密,然后使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息后,用不同的密鑰解密並可核對信息摘要。RSA算法是一種非對稱密碼算法,所謂非對稱,就是指該算法需要一對 密鑰,使用其中一個加密,則需要用另一個才能解密。RSA的算法涉及三個參數,n、e1、e2。其中,n是兩個大質數p、q的積,n的二進制表示時所占用的位數,就是所謂的密鑰長度。e1和e2是一對相關的值,e1可以任意取,但要求e1與(p-1)*(q-1) 互質;再選擇e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n,e1),(n,e2)就是密鑰對。其中(n,e1)為 公鑰,(n,e2)為私鑰。[1]RSA加解密的算法完全相同,設A為明文,B為密文,則:A=B^e2 mod n;B=A^e1 mod n;(公鑰加密體制中,一般用公鑰加密,私鑰解密)e1和e2可以互換使用,即:A=B^e1 mod n;B=A^e2 mod n;1)本地數據加密
對NSUserDefaults,sqlite存儲文件數據加密,保護帳號和關鍵信息。)URL編碼加密
對程序中出現的URL進行編碼加密,防止URL被靜態分析
3)網絡傳輸數據加密
對客戶端傳輸數據提供加密方案,有效防止通過網絡接口的攔截獲取
4)方法體,方法名高級混淆
對應用程序的方法名和方法體進行混淆,保證源碼被逆向后無法解析代碼
5)程序結構混排加密
對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低