Questions?
- 我通過(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)了焕窝,怎么辦?
- 我怎樣能證明這個(gè)信息是我希望的對(duì)象發(fā)給我的呢照藻?
- 如何服務(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的消息。
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)行解密祝峻。
三 . 在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)簽的工作。
從上圖可以看出一個(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