iOS在安全方面所采用的的加密方式:MD5、BASE64、(AES)對(duì)稱加密、非對(duì)稱加密、DES(keychain中使用)
1.MD5
使用場(chǎng)景:
(1)登陸、注冊(cè)密碼需要MD5加密下(防止直接看到明文)
(2)在http請(qǐng)求時(shí)候header需要(防止被篡改)
//MD5是不可逆的只有加密沒有解密
NSTimeIntervaltimeInterval=[[NSDate date] timeIntervalSince1970]*1000;
NSString*timeStamp=[NSString ?stringWithFormat:@"%.f",floor(timeInterval)];
//? MD5加密 單純的MD5加密不安全 需要加鹽,加鹽就是在要加密的內(nèi)容后加一些常量,常量越長(zhǎng)越安全
//鹽值
NSString*safeKey=safekey;//安全碼
NSString*signStr=[NSString ?stringWithFormat:@"timestamp=%@&safekey=%@",timeStamp,safeKey];
NSString*auth=[[Utils ?md5HexDigest:signStr ] ?lowercaseString];
[manager.requestSerializersetValue:auth ?forHTTPHeaderField:@"crpdb_auth"];
[manager.requestSerializersetValue:timeStamp ?forHTTPHeaderField:@"timestamp"];
原理簡(jiǎn)介:MD5算法原理
2.BASE64(只支持加密英文)
base64編碼是可逆的,它是一種編碼格式不是加密方式。
#import "NSString+Base64.h"
@implementation NSString (Base64)
- (NSString *)base64EncodedString;
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
return [data base64EncodedStringWithOptions:0];
}
- (NSString *)base64DecodedString
{
NSData *data = [[NSData alloc]initWithBase64EncodedString:self options:0];
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
@end
NSString *codeString = @"Hello world";
NSLog(@"原文--%@",codeString);
NSString *base64Str = [codeString base64EncodedString];
NSLog(@"Base64編碼--%@",base64Str);
NSString *decodeStr = [base64Str base64DecodedString];
NSLog(@"Base64解碼--%@",decodeStr);
3.AES加密(對(duì)稱加密)
原理:
AES 是一個(gè)新的可以用于保護(hù)電子數(shù)據(jù)的加密算法。明確地說,AES 是一個(gè)迭代的、對(duì)稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節(jié))分組加密和解密數(shù)據(jù)。與公共密鑰密碼使用密鑰對(duì)不同,對(duì)稱密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過分組密碼返回的加密數(shù)據(jù) 的位數(shù)與輸入數(shù)據(jù)相同。迭代加密使用一個(gè)循環(huán)結(jié)構(gòu),在該循環(huán)中重復(fù)置換(permutations )和替換(substitutions)輸入數(shù)據(jù)。Figure 1 顯示了 AES 用192位密鑰對(duì)一個(gè)16位字節(jié)數(shù)據(jù)塊進(jìn)行加密和解密的情形。
加密代碼
NSString *password = @"password";//一般來說用戶名就是用戶密碼的Key
NSString *passwordKey = @"userName";
NSString *encryptedData = [AESCrypt encrypt:password password:passwordKey];//加密
NSString *messagepassword = [AESCrypt decrypt:encryptedData password:passwordKey]; //解密
NSLog(@"加密結(jié)果 = %@",encryptedData);
NSLog(@"解密結(jié)果 = %@",messagepassword);
加密實(shí)例代碼
-(void)saveUserNameAndPwd:(NSString *)userName andPwd:(NSString *)pwd
{
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
[settings removeObjectForKey:@"UserName"];
[settings removeObjectForKey:@"Password"];
[settings setObject:userName forKey:@"UserName"];
pwd = [AESCrypt encrypt:pwd password:@"pwd"];
[settings setObject:pwd forKey:@"Password"];
[settings synchronize];
}
-(NSString *)getPwd
{
NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
NSString * temp = [settings objectForKey:@"Password"];
return [AESCrypt decrypt:temp password:@"pwd"];
}
4.DES(對(duì)稱加密)
DES(數(shù)據(jù)加密標(biāo)準(zhǔn))原理
DES是一個(gè)分組加密算法,它以64位為分組對(duì)數(shù)據(jù)加密。64位一組的明文從算法的一端輸入,64位的密文從另一段輸出。它是一個(gè)對(duì)稱算法:加密和解密用的是同一個(gè)算法。
密鑰通常表示為64位的數(shù),但每個(gè)第8位都用作奇偶校驗(yàn),可以忽略,所以密鑰長(zhǎng)度為56位。密鑰可以是任意的56位的數(shù),且可在任意的時(shí)候改變。
DES算法只不過是加密的兩個(gè)基本技術(shù)——混亂和擴(kuò)散的組合,即先代替后置換,它基于密鑰作用于明文,這是一輪(round),DES在明文分組上實(shí)施16輪相同的組合技術(shù)。
用于keychain本地存儲(chǔ)鑰匙串
加密、解密代碼
pod 'SSKeychain'
NSString *bundleID = [NSBundle mainBundle].bundleIdentifier;
[SSKeychain setPassword:@"111" forService:bundleID account:@"ni"];
[SSKeychain setPassword:@"222" forService:bundleID account:@"wo"];
[SSKeychain setPassword:@"333" forService:bundleID account:@"ta"];
NSString *passwords = [SSKeychain passwordForService:bundleID account:@"wo"];
NSLog(passwords);
總結(jié):對(duì)稱加密分為 AES和DES,AES高級(jí)加密標(biāo)準(zhǔn),DES數(shù)據(jù)加密標(biāo)準(zhǔn)。
一般使用都是將用戶名和密碼存儲(chǔ)到本地。用于本地用戶存儲(chǔ)化。
對(duì)稱加密就是需要一個(gè)公鑰,拿著公鑰去加密,并且拿著公鑰去解密。帶來問題是:一旦公鑰被獲取,就會(huì)被解密。
5.非對(duì)稱加密
原理簡(jiǎn)介
RSA是目前最有影響力的公鑰加密算法,該算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰,即公鑰,而兩個(gè)大素?cái)?shù)組合成私鑰。公鑰是可發(fā)布的供任何人使用,私鑰則為自己所有,供解密之用。
解密者擁有私鑰,并且將由私鑰計(jì)算生成的公鑰發(fā)布給加密者。加密都使用公鑰進(jìn)行加密,并將密文發(fā)送到解密者,解密者用私鑰解密將密文解碼為明文。
以甲要把信息發(fā)給乙為例,首先確定角色:甲為加密者,乙為解密者。首先由乙隨機(jī)確定一個(gè)KEY,稱之為密匙,將這個(gè)KEY始終保存在機(jī)器B中而不發(fā)出來;然后,由這個(gè) KEY計(jì)算出另一個(gè)KEY,稱之為公匙。這個(gè)公鑰的特性是幾乎不可能通過它自身計(jì)算出生成它的私鑰。接下來通過網(wǎng)絡(luò)把這個(gè)公鑰傳給甲,甲收到公鑰后,利用公鑰對(duì)信息加密,并把密文通過網(wǎng)絡(luò)發(fā)送到乙,最后乙利用已知的私鑰,就對(duì)密文進(jìn)行解碼了。以上就是RSA算法的工作流程。
簡(jiǎn)單說 ?甲利用公鑰加密 ?乙利用隨機(jī)key作為私鑰
公鑰是通過私鑰生成,并且公鑰幾乎不能解析成私鑰,公鑰可以通過網(wǎng)絡(luò)傳輸給甲,不用擔(dān)心公鑰被劫持。公鑰是用來加密的。
私鑰保存在服務(wù)器,可以使用私鑰解密被公鑰加密后的數(shù)據(jù)。
使用地方
支付寶RSA簽名
iOS中使用RSA加密
http://www.lxweimin.com/p/74a796ec5038
總結(jié):
可能會(huì)有人在不理解Base64編碼的情況下,將其誤用于數(shù)據(jù)加密或數(shù)據(jù)校驗(yàn)。
Base64是一種數(shù)據(jù)編碼方式,目的是讓數(shù)據(jù)符合傳輸協(xié)議的要求。標(biāo)準(zhǔn)Base64編碼解碼無需額外信息即完全可逆,即使你自己自定義字符集設(shè)計(jì)一種類Base64的編碼方式用于數(shù)據(jù)加密,在多數(shù)場(chǎng)景下也較容易破解。
對(duì)于數(shù)據(jù)加密應(yīng)該使用專門的目前還沒有有效方式快速破解的加密算法。比如:對(duì)稱加密算法AES-128-CBC,對(duì)稱加密需要密鑰,只要密鑰沒有泄露,通常難以破解;也可以使用非對(duì)稱加密算法,如 RSA,利用極大整數(shù)因數(shù)分解的計(jì)算量極大這一特點(diǎn),使得使用公鑰加密的數(shù)據(jù),只有使用私鑰才能快速解密。
對(duì)于數(shù)據(jù)校驗(yàn),也應(yīng)該使用專門的消息認(rèn)證碼生成算法,如 HMAC - 一種使用單向散列函數(shù)構(gòu)造消息認(rèn)證碼的方法,其過程是不可逆的、唯一確定的,并且使用密鑰來生成認(rèn)證碼,其目的是防止數(shù)據(jù)在傳輸過程中被篡改或偽造。將原始數(shù)據(jù)與認(rèn)證碼一起傳輸,數(shù)據(jù)接收端將原始數(shù)據(jù)使用相同密鑰和相同算法再次生成認(rèn)證碼,與原有認(rèn)證碼進(jìn)行比對(duì),校驗(yàn)數(shù)據(jù)的合法性。
可以看出MD5作用主要是用戶數(shù)據(jù)校驗(yàn);對(duì)稱加密和非對(duì)稱加密用于數(shù)據(jù)加密;base64是數(shù)據(jù)的編碼方式。
以下是查看的鏈接
鏈接:http://www.lxweimin.com/p/b8a5e1c770f9
http://www.lxweimin.com/p/b12e88231367
http://www.lxweimin.com/p/74a796ec5038