一. 加密常識
1.1 對稱加密和非對稱加密
對稱加密
- DES:加密標(biāo)準(zhǔn)
- 3DES:加強(qiáng)版DES
- AES:現(xiàn)在的加密標(biāo)準(zhǔn)
iOS系統(tǒng)的加密方式
非對稱加密
- ECC(橢圓加密算法吓歇,Elliptic Curve Cryptography)推薦
- RSA
- Elgamal
1.2 密鑰配送問題
- 事先共享密鑰
- 公鑰密碼(rsa等非對稱加密)
1.3 加密方式
- ECB:將每一個數(shù)據(jù)塊單獨(dú)加密
- CBC:加密每一個數(shù)據(jù)塊,都會與上一個數(shù)據(jù)塊之間有聯(lián)系.能夠保證密文的完整性,任何一個數(shù)據(jù)塊改變了,都會對后面的數(shù)據(jù)造成破壞.(推薦)
1.4 單向散列函數(shù)(hash函數(shù))
- MD5 ---------- 128bit,不安全
- SHA-1---------160bit,不安全
- SHA-2
- SHA-256 -------256bit,安全推薦
- SHA-384 ,,,,,,SHA-512
- 在具體算法的選取上,你只需要記着佳:對稱加密用 AES-CTR颖杏、非對稱加密用 ECC纯陨、散列算法用 SHA256 加鹽。這些算法就能夠滿足大部分的使用場景了留储,并且在未來很長一段時間內(nèi)翼抠,都可以保持一個較高的安全強(qiáng)度。
二. 證書
- CA機(jī)構(gòu) : 證書授權(quán)中心获讳,是電子商務(wù)交易中受信任的第三方阴颖,承擔(dān)公鑰體系中公鑰的合法性檢驗(yàn)的責(zé)任。
- 證書 : 是CA機(jī)構(gòu)用自己的私鑰將用戶的公鑰進(jìn)行簽名,保證用戶的公鑰不被篡改.
- CA的數(shù)字簽名,主要是為了證明你拿到的CA證書確實(shí)是CA機(jī)構(gòu)頒發(fā)的.
- 服務(wù)器申請一個CA證書.
- CA機(jī)構(gòu)拿到服務(wù)器的公鑰丐膝、信息,用hash算法得到一個
信息摘要
并用自己的私鑰進(jìn)行簽名.然后把服務(wù)器的公鑰量愧、信息和簽名組合成一個證書給服務(wù)器. - 客戶端發(fā)送請求到服務(wù)器,服務(wù)器會將自己的公鑰、信息返回給客戶端,客戶端拿到服務(wù)器的公鑰帅矗、信息,用hash算法得到一個
信息摘要
;
然后在CA機(jī)構(gòu)拿到公鑰解密CA的證書可以拿到CA認(rèn)證的服務(wù)器的公鑰偎肃、信息進(jìn)行hash算法也會得到一個信息摘要
. - 如果兩個
信息摘要
是一樣的,就說明信息卻是來自于真正的服務(wù)器,沒有中間人攻擊.
三. SSL/TLS
3.1 SSL(Secure Sockets Layer 安全套接字協(xié)議)的作用
- 機(jī)密性:SSL協(xié)議使用密鑰加密通信數(shù)據(jù)。
- 可靠性:服務(wù)器和客戶都會被認(rèn)證浑此,客戶的認(rèn)證是可選的累颂。
- 完整性:SSL協(xié)議會對傳送的數(shù)據(jù)進(jìn)行完整性檢查。
3.2 SSL 基本原理
- 客戶端向服務(wù)器發(fā)送Client Hello 消息,包含隨機(jī)數(shù)凛俱、加密方法等參數(shù)
- 服務(wù)端收到ClientHello消息后紊馏,再發(fā)送ServerHello消息回應(yīng)客戶端
- 服務(wù)器將公鑰發(fā)送給客戶端,客戶端通過證書驗(yàn)證服務(wù)器的真假性
單向認(rèn)證完成
- (可選):服務(wù)器如果開啟了雙向認(rèn)證,那么就需要客戶端將自己的證書發(fā)送給服務(wù)器
- 兩端使用協(xié)商好的加密算法進(jìn)行通訊
四. HTTPS
HTTPS是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版最冰。即HTTP下加入SSL層瘦棋,https的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容請看SSL暖哨。
五. 中間人攻擊
5.1 公鑰私鑰問題
私鑰只有自己知道,公鑰可以分發(fā)給其他人
- 公鑰加密,私鑰解密,可以用來傳遞消息(加密).(任何人都可以用公鑰加密東西發(fā)給alice,因?yàn)橹挥衋lice有私鑰,所以只有alice能解密)
- 私鑰加密,公鑰解密,可以用來驗(yàn)證(簽名).(alice用私鑰加密東西,有alice公鑰的就可以解密.如果bob想冒充alice,因?yàn)閎ob不知道alice的私鑰,那么bob只能用自己的私鑰進(jìn)行加密,但是別人還是用alice的公鑰進(jìn)行解密,就會出錯)
- 傳遞消息 和 驗(yàn)證簽名 是相反的.
5.2 安全隱患
alice要給bob發(fā)消息.
需要拿到bob的公鑰,加密消息然后發(fā)給bob.
bob再用自己的私鑰進(jìn)行解密.
-----warning------
如果alice拿到的公鑰不是bob的,而是中間人的呢?
所以,確定拿到的公鑰必須是bob的,才是安全的.
這時候就需要CA機(jī)構(gòu)的證書來做安全保障.
六.charles
平時我們總會用charles抓包,只要給手機(jī)設(shè)置了代理,就能在電腦端看到charles攔擊的app和服務(wù)器的通訊包,下面就圍繞charles來看看iOS逆向相關(guān)的東西.
charles官網(wǎng)介紹:
Charles can be used as a man-in-the-middle HTTPS proxy, enabling you to view in plain text the communication between web browser and SSL web server.Charles does this by becoming a man-in-the-middle. Instead of your browser seeing the server’s certificate, Charles dynamically generates a certificate for the server and signs it with its own root certificate (the Charles CA Certificate). Charles receives the server’s certificate, while your browser receives Charles’s certificate. Therefore you will see a security warning, indicating that the root authority is not trusted. If you add the Charles CA Certificate to your trusted certificates you will no longer see any warnings – see below for how to do this.
6.1 charles的使用
- mac端下載一個charles作為手機(jī)的代理使用
- 選擇安裝一個手機(jī)或者遠(yuǎn)端瀏覽器的證書
- 手機(jī)和電腦連接同一個wifi,點(diǎn)擊該wift的設(shè)置,配置代理,服務(wù)器為電腦的IP地址,端口號為8888
- 打開safari輸入
chls.pro/ssl
下載charles的證書,打開設(shè)置,安裝該證書. - 打開charles,就可以看到你app的所有網(wǎng)絡(luò)請求了.
6.2 charles的原理
為啥charels能攔截app的網(wǎng)絡(luò)請求呢?
很多人聽說https是安全的,自己公司用了https后為啥還能被charles攔截明文請求呢?
- ??其實(shí)是概念用混了.
- https確實(shí)是安全的,app和charles通信是安全的,charles和服務(wù)器通訊也是安全的.
- 但是app到服務(wù)器不是安全的,因?yàn)橛辛?code>man-in-the-middle身份的charles這個代理.
簡單看下charles的工作過程吧.
- 客戶端向服務(wù)器發(fā)起
HELLO WORLD
的HTTPS請求,客戶端使用charles的公鑰加密HELLO WORLD
- 因?yàn)榭蛻舳嗽O(shè)置了代理,所以charles接收到請求
- charles使用自己的私鑰解密
HELLO WORLD
- 如果服務(wù)器沒有對客戶端做雙向認(rèn)證,那么charles就可以拿著客戶端的請求向服務(wù)器發(fā)送請求
- 服務(wù)器將公鑰發(fā)送給charles
- charles作為中間人,解密服務(wù)器的數(shù)據(jù)然后用自己的私鑰加密發(fā)送給客戶端,客戶端使用charles的公鑰進(jìn)行解密.
N. 答疑
- MD5絕對安全嗎?
答案是NO,md5為32位,也就是說它能表示的最多的可能為36(26個字母加10個數(shù)字)的32次方,而地球上有那么多的東西可以加密.所以有可能不同的東西的MD5值是一樣的
- base64是加密方式嗎?
base64只是對二進(jìn)制進(jìn)行編碼解碼的方式,不能用來加密. base64依次截取6bit然后用64種字符表示,如果最后為000 000,那么用=表示. 所以base64其實(shí)共有65種字符.
- 使用https就安全了嗎
https本身是安全的,因?yàn)閔ttps內(nèi)置了SSL協(xié)議,可以使得兩端通訊完全使用的是密文傳輸.
但是https只是整個通訊環(huán)節(jié)的一部分,如果沒有設(shè)置好可能會受到中間人攻擊,所以還需要進(jìn)行單向認(rèn)證或者雙向認(rèn)證設(shè)置,才能更為安全.1.如果客戶端沒有做認(rèn)證
黑客可以直接抓包,可以修改通信內(nèi)容2.如果客戶端做了單向認(rèn)證
黑客可以逆向客戶端,并修改客戶端的認(rèn)證方式,然后就可以進(jìn)行上步的操作所以為了更加的安全,我們可以給傳輸?shù)臄?shù)據(jù)自己加一次密.這樣的話就算有中間人攻擊,拿到的卻是我們加密過的東西,那么中間人還得再破解一次,相當(dāng)難了.
- 我們在使用md5的時候,可以自己加鹽.(通過服務(wù)器下發(fā)不同的鹽,不同的用戶不同的鹽)
- hmac: MD5升級版,通過加鹽來增強(qiáng)密碼強(qiáng)度,鹽在用戶注冊的時候下發(fā),并把每個用戶不同的鹽存在服務(wù)器.(加時間戳,服務(wù)器向前驗(yàn)證1分鐘,這樣黑客破解就只有1分鐘)
- 為了防止加密方式被破解,服務(wù)器可以用當(dāng)前時間往前推1分鐘然后在本地MD5,判斷是否和客戶端傳過來的一樣?如果一樣則說明是客戶端傳過來的值,而不是中間人.