iOS 數(shù)據(jù)加密的<概念>和<用法>速成

加密解密

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加密算法。
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;

還需要在Xcode中配置一下,打開(kāi)開(kāi)關(guān)就行

非對(duì)稱算法

  • 算法公開(kāi),可逆的加密算法
    • 用公鑰加密,私鑰解密
    • 用私鑰加密,用公鑰解密
    • 速度慢,適合小數(shù)據(jù)加密

RSA

  • 普遍的加密
    • 密鑰的安全要求很高的話,可以先用RSA加密AES的密鑰
RSA原理

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)證信息
  • 客戶端鏈接服務(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];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容