16.iOS 加密機(jī)制&驗(yàn)簽&加Salt

Questions?

    1. 我通過(guò)app向服務(wù)器發(fā)送一條登錄的請(qǐng)求,那么這個(gè)請(qǐng)求里面肯定會(huì)包含用戶名和密碼等相關(guān)的信息,如果這個(gè)時(shí)候沒(méi)有對(duì)數(shù)據(jù)進(jìn)行處理鬼悠,那么我現(xiàn)在使用抓包工具就可以很容易得抓取到你的用戶名和密碼,而且大部分人還喜歡設(shè)置相同的密碼(支付寶之類的)亏娜,那么這個(gè)時(shí)候我的信息就很危險(xiǎn)了焕窝,怎么辦?
    1. 我怎樣能證明這個(gè)信息是我希望的對(duì)象發(fā)給我的呢照藻?
    1. 如何服務(wù)器被黑客入侵了怎么辦袜啃?在數(shù)據(jù)庫(kù)中存放的數(shù)據(jù)怎么辦?

Answers幸缕?

  • 1 根據(jù)自己的具體需求選擇合適的加密算法對(duì)需要傳輸?shù)男畔⑦M(jìn)行加密。加密算法可以疊加使用晰韵;
  • 2 驗(yàn)簽
  • 3 將需要保存到服務(wù)器的關(guān)鍵性數(shù)據(jù)進(jìn)行加鹽處理

一. 常見的加密算法:

1.1 base64加密

  • base64 編碼是現(xiàn)代密碼學(xué)的基礎(chǔ)

  • 基本原理:
    原本是 8個(gè)bit 一組表示數(shù)據(jù),改為 6個(gè)bit一組表示數(shù)據(jù),不足的部分補(bǔ)零,每 兩個(gè)0 用 一個(gè) = 表示
    用base64 編碼之后,數(shù)據(jù)長(zhǎng)度會(huì)變大,增加了大約 1/3 左右.(8-6)/6
    可進(jìn)行反向解密

  • 編碼有個(gè)非常顯著的特點(diǎn),末尾有個(gè) = 號(hào)

//文件加密
// 獲取需要加密文件的二進(jìn)制數(shù)據(jù)
    NSData *data = [NSData dataWithContentsOfFile:@"/Users/wangpengfei/Desktop/photo/IMG_5551.jpg"];

    // 或 base64EncodedStringWithOptions
    NSData *base64Data = [data base64EncodedDataWithOptions:0];

    // 將加密后的文件存儲(chǔ)到桌面
    [base64Data writeToFile:@"/Users/wangpengfei/Desktop/123" atomically:YES];
//文件解密
// 獲得加密后的二進(jìn)制數(shù)據(jù)
    NSData *base64Data = [NSData dataWithContentsOfFile:@"/Users/xxx/Desktop/123"];

    // 解密 base64 數(shù)據(jù)
    NSData *baseData = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];

    // 寫入桌面
    [baseData writeToFile:@"/Users/xxx/Desktop/IMG_5551.jpg" atomically:YES];

1.2 MD5 (信息-摘要算法) 哈希算法之一

  • 基本原理:
    把一個(gè)任意長(zhǎng)度的字節(jié)串變換成一定長(zhǎng)度的十六進(jìn)制的大整數(shù).

  • 注意,字符串的轉(zhuǎn)換過(guò)程是不可逆的,不能通過(guò)加密結(jié)果,反向推導(dǎo)出原始內(nèi)容

MD5 特點(diǎn):
  • 壓縮性 : 任意長(zhǎng)度的數(shù)據(jù),算出的 MD5 值長(zhǎng)度都是固定的.

  • 容易計(jì)算 : 從原數(shù)據(jù)計(jì)算出 MD5 值很容易.

  • 抗修改性 : 對(duì)原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改一個(gè)字節(jié),所得到的 MD5 值都有很大區(qū)別.

  • 弱抗碰撞 : 已知原數(shù)據(jù)和其 MD5 值,想找到一個(gè)具有相同 MD5 值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的.

  • 5.強(qiáng)抗碰撞: 想找到兩個(gè)不同數(shù)據(jù),使他們具有相同的 MD5 值,是非常困難的

MD5 應(yīng)用:
  • 一致性驗(yàn)證:MD5將整個(gè)文件當(dāng)做一個(gè)大文本信息,通過(guò)不可逆的字符串變換算法,產(chǎn)生一個(gè)唯一的MD5信息摘要.就像每個(gè)人都有自己獨(dú)一無(wú)二的指紋,MD5對(duì)任何文件產(chǎn)生一個(gè)獨(dú)一無(wú)二的數(shù)字指紋.

  • 利用 MD5 來(lái)進(jìn)行文件校驗(yàn),被大量應(yīng)用在軟件下載站,論壇數(shù)據(jù)庫(kù),系統(tǒng)文件安全等方面(是否認(rèn)為添加木馬发乔,篡改文件內(nèi)容等).

  • 數(shù)字簽名;

  • 安全訪問(wèn)認(rèn)證;

MD5 使用:

利用 MD5 對(duì)字符串進(jìn)行加密

  NSString *password = @"Hello";

  password = [password md5String];

加鹽,可以保證 MD5加密之后更加安全

  NSString *salt = @"234567890-!@#$%^&*()_+QWERTYUIOP{ASDFGHJKL:XCVBNM<>";

  [password stringByAppendingString:salt];

  password = [password md5String];
每一個(gè)公司都有自己的“鹽值”雪猪,鹽值越復(fù)雜栏尚,越安全
加鹽:
  • 在密碼學(xué)中,是指通過(guò)在密碼任意固定的位置插入特定的字符串只恨,讓散列后的節(jié)后和使用原始數(shù)據(jù)的結(jié)果不相符译仗,之后再多次求MD5,之后在和服務(wù)器原先存儲(chǔ)的用同樣的方法處理過(guò)的密碼匹配官觅,如果一直纵菌,則登錄成功。
  • 加鹽的作用主要是防止服務(wù)器數(shù)據(jù)被盜休涤,所以不在服務(wù)器中存儲(chǔ)原始數(shù)據(jù)咱圆,MD5又是不可逆的算法,所以保證了服務(wù)器數(shù)據(jù)的安全性功氨。

1.3 AES加密:對(duì)稱加密序苏,隨機(jī)生成一個(gè) AESkey,運(yùn)算速度較快捷凄。

1.4 RSA加密:非對(duì)稱加密生成一對(duì)公鑰私鑰忱详,運(yùn)算速度較慢。

二 . 加密和認(rèn)證的原理

2.1 加密和認(rèn)證

  • 加密是將數(shù)據(jù)資料加密跺涤,使得非法用戶即使取得加密過(guò)的資料匈睁,也無(wú)法獲取正確的資料內(nèi)容监透,所以數(shù)據(jù)加密可以保護(hù)數(shù)據(jù),防止監(jiān)聽攻擊软舌。其重點(diǎn)在于數(shù)據(jù)的安全性才漆。
  • 身份認(rèn)證是用來(lái)判斷某個(gè)身份的真實(shí)性,確認(rèn)身份后佛点,系統(tǒng)才可以依不同的身份給予不同的權(quán)限醇滥。其重點(diǎn)在于用戶的真實(shí)性。兩者的側(cè)重點(diǎn)是不同的超营。

2.2 公鑰和私鑰

  • 在現(xiàn)代密碼體制中加密和解密是采用不同的密鑰(公開密鑰)鸳玩,也就是非對(duì)稱密鑰密碼系統(tǒng),每個(gè)通信方均需要兩個(gè)密鑰演闭,即公鑰和私鑰不跟,這兩把密鑰可以互為加解密。
  • 公鑰是公開的米碰,不需要保密窝革,而私鑰是由個(gè)人自己持有,并且必須妥善保管和注意保密吕座。

2.3 公鑰私鑰的原則:

  • 一個(gè)公鑰對(duì)應(yīng)一個(gè)私鑰虐译。
  • 密鑰對(duì)中,讓大家都知道的是公鑰吴趴,不告訴大家漆诽,只有自己知道的,是私鑰锣枝。
  • 如果用其中一個(gè)密鑰加密數(shù)據(jù)厢拭,則只有對(duì)應(yīng)的那個(gè)密鑰才可以解密。
  • 如果用其中一個(gè)密鑰可以進(jìn)行解密數(shù)據(jù)撇叁,則該數(shù)據(jù)必然是對(duì)應(yīng)的那個(gè)密鑰進(jìn)行的加密供鸠。

2.4 基于公開密鑰的加密&認(rèn)證

2.4.1 基于公開密鑰的加密過(guò)程

場(chǎng)景1:比如有兩個(gè)用戶Alice和Bob,Alice想把一段明文通過(guò)雙鑰加密的技術(shù)發(fā)送給Bob税朴,Bob有一對(duì)公鑰和私鑰回季,那么加密解密的過(guò)程如下:

  • Bob將他的公開密鑰傳送給Alice。
  • Alice用Bob的公開密鑰加密她的消息正林,然后傳送給Bob泡一。
  • Bob用他的私人密鑰解密Alice的消息。
屏幕快照 2017-08-18 14.56.05.png
2.4.2 基于公開密鑰的認(rèn)證過(guò)程(驗(yàn)簽)

身份認(rèn)證和加密就不同了觅廓,主要用戶鑒別用戶的真?zhèn)伪侵摇_@里我們只要能夠鑒別一個(gè)用戶的私鑰是正確的,就可以鑒別這個(gè)用戶的真?zhèn)巍?/p>

場(chǎng)景2:還是Alice和Bob這兩個(gè)用戶,Alice想讓Bob知道自己是真實(shí)的Alice帖蔓,而不是假冒的矮瘟,因此Alice只要使用公鑰密碼學(xué)對(duì)文件簽名發(fā)送給Bob,Bob使用Alice的公鑰對(duì)文件進(jìn)行解密塑娇,如果可以解密成功澈侠,則證明Alice的私鑰是正確的,因而就完成了對(duì)Alice的身份鑒別埋酬。整個(gè)身份認(rèn)證的過(guò)程如下:

  • Alice用她的私人密鑰對(duì)文件加密哨啃,從而對(duì)文件簽名。
  • Alice將簽名的文件傳送給Bob写妥。
  • Bob用Alice的公鑰解密文件拳球,從而驗(yàn)證簽名。
  • Alice使用自己的私鑰加密珍特,Bob用Alice的公鑰進(jìn)行解密祝峻。
屏幕快照 2017-08-18 14.56.13.png

三 . 在App中是到底如何使用這些算法的?

3.1 我們公司的項(xiàng)目采用的是AES+RSA加密的方式進(jìn)行加密的扎筒;

  • 服務(wù)器生成并保存一對(duì)公鑰和私鑰莱找,服務(wù)器將公鑰發(fā)給客戶端,客戶端用公鑰加密后將數(shù)據(jù)發(fā)給服務(wù)器嗜桌,服務(wù)器用私鑰去解密宋距。
  • 客戶端也會(huì)生成一對(duì)公鑰和私鑰,在每次程序啟動(dòng)配置的時(shí)候生成并保存在本地症脂,公鑰隨著基本參數(shù)傳給服務(wù)器。

3.2 加密過(guò)程(iOS客戶端)

  • AES加密生成AESkey淫僻,RSA加密生成一對(duì)密鑰對(duì)诱篷;
  • 利用RSA算法將AESkey加密,然后數(shù)據(jù)用AESkey加密雳灵,將加密后AESkey值和加密后的數(shù)據(jù)一起傳給服務(wù)器棕所。
  • 服務(wù)器用私鑰解密出AESkey,在用AESkey解密出真實(shí)的信息悯辙。

3.3 補(bǔ)充

  • 因?yàn)榭蛻舳撕头?wù)器需要相互發(fā)送信息琳省,都需要加密解密從對(duì)方傳來(lái)的數(shù)據(jù),所以雙方都需要生成一對(duì)公鑰私鑰躲撰,服務(wù)器端的在客戶端第一次請(qǐng)求的時(shí)候會(huì)返回303公鑰失效的代碼针贬,客戶端會(huì)重新請(qǐng)求,這次服務(wù)器會(huì)發(fā)送正確的公鑰拢蛋,客戶端會(huì)保存下來(lái)這個(gè)公鑰桦他。服務(wù)器端會(huì)定時(shí)生成新的公鑰私鑰。
  • 在沒(méi)有private key的情況下谆棱,無(wú)法解密得到正確的數(shù)據(jù)快压,所以一定要注意private key的保存圆仔。

3.4 一對(duì)密鑰對(duì)的使用
公鑰加密,私鑰解密蔫劣;
私鑰簽名坪郭,公鑰驗(yàn)簽;

  • 注:驗(yàn)簽主要是為了驗(yàn)證數(shù)據(jù)的來(lái)源的正確性脉幢,在沒(méi)有特殊的要求的時(shí)候歪沃,可以不做驗(yàn)簽的工作。
屏幕快照 2017-08-18 16.16.14.png

從上圖可以看出一個(gè)對(duì)象可以擁有一個(gè)private key和多個(gè)public key鸵隧。

部分內(nèi)容取自:
http://www.reibang.com/p/422e97e60f2d
http://www.reibang.com/p/a2868b27675c
http://www.williamlong.info/archives/837.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绸罗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子豆瘫,更是在濱河造成了極大的恐慌珊蟀,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外驱,死亡現(xiàn)場(chǎng)離奇詭異育灸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)昵宇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門磅崭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瓦哎,你說(shuō)我怎么就攤上這事砸喻。” “怎么了蒋譬?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵割岛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我犯助,道長(zhǎng)癣漆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任剂买,我火速辦了婚禮惠爽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瞬哼。我一直安慰自己婚肆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布倒槐。 她就那樣靜靜地躺著旬痹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上两残,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天永毅,我揣著相機(jī)與錄音,去河邊找鬼人弓。 笑死沼死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崔赌。 我是一名探鬼主播意蛀,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼健芭!你這毒婦竟也來(lái)了县钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤慈迈,失蹤者是張志新(化名)和其女友劉穎若贮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痒留,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谴麦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伸头。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匾效。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恤磷,靈堂內(nèi)的尸體忽然破棺而出面哼,到底是詐尸還是另有隱情,我是刑警寧澤扫步,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布精绎,位于F島的核電站,受9級(jí)特大地震影響锌妻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旬牲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望原茅。 院中可真熱鬧,春花似錦擂橘、人聲如沸晌区。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恼五。三九已至,卻和暖如春哭懈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遣总。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旭斥,地道東北人容达。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垂券,于是被迫代替她去往敵國(guó)和親花盐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子圆米,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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