加密解密
base64編碼
是網(wǎng)絡(luò)上使用最廣泛的編碼系統(tǒng),能夠?qū)⑷魏味M(jìn)制數(shù)據(jù),轉(zhuǎn)換成只有 65 個(gè)字符組成的文本文件
az,AZ,0~9,+,/,=
Base 64 編碼后的結(jié)果能夠反算,不夠安全
Base 64 是所有現(xiàn)代加密算法的基礎(chǔ)算法
base64只能算
偽加密,因?yàn)閎ase64的碼表是公開(kāi)的.如果自己創(chuàng)建私有
碼表就可以實(shí)現(xiàn)加密的效果.base64編碼 "加密"
//加密到base64
- (NSString *)encodeBase64String:(NSString *)UTF8String{
//將普通字符串轉(zhuǎn)換成Data
NSData *data = [UTF8String dataUsingEncoding:NSUTF8StringEncoding];
//將普通Data編碼成base64string
return [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
- 從base64編碼解碼
//將base64轉(zhuǎn)換成普通字符串
- (NSString *)decodeBase64String:(NSString *)base64String
{
NSData *data = [[NSData alloc]initWithBase64EncodedString:base64String options:0];
return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
對(duì)稱算法
- 加密解密都使用相同的密鑰
- 速度快,適合大數(shù)據(jù)加密
- AES
- AES是美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所NIST旨在取代DES的21世紀(jì)的加密標(biāo)準(zhǔn)。
- DES,3DES.(重點(diǎn))Keychain中保存密碼就是用過(guò)3DES加密
- 3DES(或稱為T(mén)riple DES)是三重?cái)?shù)據(jù)加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次DES加密算法。

鑰匙串Keychain
網(wǎng)絡(luò)數(shù)據(jù)就不用說(shuō)了,任何節(jié)點(diǎn)都可能截取請(qǐng)求.所以網(wǎng)絡(luò)數(shù)據(jù)一定要加密
不過(guò)即使存儲(chǔ)在本地沙盒的敏感信息也一定要加密,防止手機(jī)越獄后可以訪問(wèn)到程序的沙盒從而泄密.
- SSKeychain 提供把密碼添加到iOS系統(tǒng)的鑰匙串的接口 推薦直接使用
- 內(nèi)部是3DES加密 就是進(jìn)行三輪DES加密.
- SSKeychain框架的使用
/**
設(shè)置密碼到Keychain鑰匙串
@param password 字符串形式的密碼
@param serviceName 服務(wù)名稱,其實(shí)是Bundle identifier
@param account 密碼對(duì)應(yīng)的帳號(hào)
@return 是否寫(xiě)入成功
*/
+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;
/**
獲取保存的密碼
@return 返回對(duì)應(yīng)的密碼
*/
+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;
/**
刪除對(duì)應(yīng)的密碼
@return 是否刪除成功
*/
+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;

非對(duì)稱算法
- 算法公開(kāi),可逆的加密算法
- 用公鑰加密,私鑰解密
- 用私鑰加密,用公鑰解密
- 速度慢,適合小數(shù)據(jù)加密
RSA
- 普遍的加密
- 密鑰的安全要求很高的話,可以先用RSA加密AES的密鑰

HTTPS基本原理
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,簡(jiǎn)單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。TLS與SSL在傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密。
SSL協(xié)議可分為兩層: SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。 SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開(kāi)始前,通訊雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。
說(shuō)人話就是找SSL服務(wù)器,通過(guò)幾次握手,驗(yàn)證彼此的證書(shū),確定傳輸?shù)拿荑€.然后根據(jù)記錄協(xié)議進(jìn)行安全的傳輸. 證書(shū)由第三方發(fā)布,第三方進(jìn)行驗(yàn)證.
- 服務(wù)器找CA申請(qǐng)證書(shū)
- 證書(shū)中有
公鑰,私鑰,認(rèn)證信息
- 證書(shū)中有
-
客戶端鏈接服務(wù)器,告訴服務(wù)器自己支持的加密算法,摘要算法,和SSL版本號(hào). 同時(shí)發(fā)送一個(gè)隨機(jī)數(shù)用于產(chǎn)生密鑰. -
服務(wù)器選擇要使用的加密算法,并將自己的證書(shū)中的認(rèn)證信息,公鑰回傳給客戶端. -
客戶端通過(guò)CA服務(wù)器驗(yàn)證證書(shū).如果服務(wù)器要求驗(yàn)證客戶端證書(shū),就把自己的證書(shū)發(fā)給服務(wù)器. -
服務(wù)器根據(jù)前面提供的隨機(jī)數(shù)計(jì)算出用于數(shù)據(jù)加密的共享密鑰 -
客戶端將所有握手消息的 MAC 值發(fā)送給服務(wù)器端,服務(wù)器端也將所有握手消息的 MAC 值發(fā)送給客戶端。這么做是為了防止攻擊者在握手過(guò)程中篡改了消息內(nèi)容。
客戶端和服務(wù)器端使用握手過(guò)程中產(chǎn)生的加密密鑰交換握手結(jié)束消息。握手結(jié)束,SSL 連接建立。
在 SSL 連接建立后,將開(kāi)始遵循記錄協(xié)議對(duì)數(shù)據(jù)進(jìn)行傳輸。
散列算法
不可逆加密:MD5,SHA1,SHA256,SHA512
MD5Hash算法的特點(diǎn):
1:輸入任意長(zhǎng)度的信息,經(jīng)過(guò)摘要處理,輸出為128位的信息.。(數(shù)字指紋)
2:不同輸入產(chǎn)生不同的結(jié)果,(唯一性)
3:根據(jù)128位的輸出結(jié)果不可能反推出輸入的信息(不可逆)
- MD5 摘要算法
- 在加密的時(shí)候就已經(jīng)丟失了原來(lái)的信息,所以沒(méi)辦法還原回去.
- MD5以后只有128位二進(jìn)制數(shù)據(jù),表現(xiàn)為長(zhǎng)度32的16進(jìn)制字符串.
- MD5對(duì)密碼加密,工具類(lèi).
- MD5在線破解
- 暴力破解,字典破解.將明文密文存為字典,查詢.
- 防止破解:就算將密碼以MD5形式存儲(chǔ),也可能出現(xiàn)暴力破解,撞庫(kù)等泄密,所以要提高存儲(chǔ)安全性
-
加鹽:原密碼加一個(gè)復(fù)雜的字符串,防止用戶輸入的密碼過(guò)于簡(jiǎn)單.但不太安全,計(jì)算機(jī)性能越來(lái)越強(qiáng)大,遲早被破解.
-
HMAC(朋友們,重!!點(diǎn)!! 敲黑板)
HMAC是密鑰相關(guān)的哈希運(yùn)算消息認(rèn)證碼(Hash-based Message Authentication Code),HMAC運(yùn)算利用哈希算法,以一個(gè)密鑰和一個(gè)消息為輸入,生成一個(gè)
消息摘要作為輸出。
既然是摘要,你應(yīng)該就懂了.和MD5一樣.不過(guò)它的安全系數(shù)更高,就算碰撞出來(lái)也不可能知道你原來(lái)的消息是什么.
HMAC+時(shí)間 實(shí)際運(yùn)用于登錄場(chǎng)景
原密碼加
KEY進(jìn)行HMAC計(jì)算,結(jié)果再加上Time后再加KEY進(jìn)行HMAC計(jì)算. 使破解有一個(gè)時(shí)效性
- HMAC+時(shí)間,每分鐘生成的值不一樣.具體步驟
- 將
KEY(第一次鏈接隨機(jī)生成的字符串)用MD5計(jì)算得到md5Key -
數(shù)據(jù)和之前md5Key的進(jìn)行HMAC計(jì)算 - 從服務(wù)器獲取
當(dāng)前時(shí)間到分鐘的字符串 - HMAC值+時(shí)間 和
KEY的MD5值進(jìn)行HMAC計(jì)算傳遞給服務(wù)器.- 考慮到網(wǎng)絡(luò)延遲,服務(wù)器一般會(huì)對(duì)接收到最終HMAC的時(shí)間和前一分鐘做兩次計(jì)算,符合其中一次即可.
- 額外好處:防止監(jiān)守自盜.公司內(nèi)部存儲(chǔ)數(shù)據(jù)也不要使用明文數(shù)據(jù),而是加密后的結(jié)果.避免出現(xiàn)CSDN的泄密事件
- 將
具體代碼步驟!
//將傳入的密碼以HMAC形式加密
- (void)hamcString:(NSString *)password complete:(void(^)(NSString * secureStr))block
{
//這是第一次鏈接時(shí)確定的KEY
NSString *KEY = @"keykey";
//將KEY做MD5處理 使用自定義分類(lèi)
NSString *md5Key = [KEY md5String];
//將明文和md5Key進(jìn)行HMAC計(jì)算
NSString *hmacStr = [password hmacMD5StringWithKey:md5Key];
//獲取服務(wù)器時(shí)間信息.
//創(chuàng)建服務(wù)器URL
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/php/hmackey.php"];
//開(kāi)啟異步任務(wù),訪問(wèn)服務(wù)器獲取時(shí)間
[[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//根據(jù)服務(wù)器返回的數(shù)據(jù)類(lèi)型,反序列化.這里返回的JSON
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSString *time = dic[@"key"];
//獲取到時(shí)間后,進(jìn)行拼接然后再進(jìn)行HMAC. 得到最后加密完成的字符串進(jìn)行傳輸
NSString * secureStr =[[hmacStr stringByAppendingString:time] hmacMD5StringWithKey:md5Key];
//因?yàn)槭蔷W(wǎng)絡(luò)異步耗時(shí)任務(wù),所以通過(guò)block回調(diào)來(lái)返回給主線程. 這里先進(jìn)入主線程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (block) {
//回調(diào)block block中只需要將生成的字符串交給服務(wù)器作為密碼進(jìn)行驗(yàn)證就行了.
//順便說(shuō)一下,登錄等敏感信息通常采用POST方式訪問(wèn)
block(secureStr);
}
}];
}] resume];
}