iOS 加密:MD5、BASE64、(AES)對(duì)稱加密、非對(duì)稱加密、DES(keychain中使用)

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);

base64編解碼過程


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ù)。

參考網(wǎng)站1

參考網(wǎng)站2

使用地方

支付寶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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容