基本知識
ASCII(American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼)。
計算機(jī)中存儲時要使用二進(jìn)制數(shù)來表示箫老,具體用哪些二進(jìn)制數(shù)字表示哪個符號,這就叫編碼辛藻。而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規(guī)則互订,于是美國有關(guān)的標(biāo)準(zhǔn)化組織就出臺了ASCII編碼吱肌。Base64:
一種用64個字符來表示任意二進(jìn)制數(shù)據(jù)的方法。使用3個字節(jié)為一組通過查找ASCII表找到對應(yīng)二進(jìn)制3*8=24bit仰禽,然后分成4組24/4=6bit氮墨,前面補(bǔ)0,轉(zhuǎn)10進(jìn)制數(shù)吐葵,作為索引查Base64表找到對應(yīng)字符规揪。Base64表索引0-63分別是A-Za-z+/。(為什么是3個自己分成4組温峭?我猜是Base64表有64個字符猛铅,最大只能是2^6,也就是6bit凤藏,然而是6bit和一個字節(jié)8bit的最小公倍數(shù)的就是24bit奸忽,也就是3個字節(jié))。數(shù)字簽名:
也稱之為數(shù)字摘要法(Digital Digest)或數(shù)字指紋法(Digital Finger Print)揖庄。hash簽名是最主要的數(shù)字簽名方法栗菜。采用單項(xiàng)Hash函數(shù)將需要加密的明文“摘要”成一串固定長度(128位)的密文這一串密文又稱為數(shù)字指紋,它有固定的長度抠艾,而且不同的明文摘要成密文苛萎,其結(jié)果總是不同的,而同樣的明文其摘要必定一致检号。常用的hash算法有MD5和SHA1,MD5算法摘要的消息有128個比特位蛙酪,SHA-1算法摘要的消息最終有160比特位的輸出齐苛。-
簽名文件和證書:
首先了解下數(shù)據(jù)交互的流程:- 發(fā)送方明文消息數(shù)字摘要
- 發(fā)送方私鑰加密數(shù)字摘要,生成簽名文件
- 發(fā)送方把公鑰給接收方桂塞,并發(fā)送明文消息和簽名文件
- 接收方收到消息凹蜂,用公鑰解密簽名文件,并用相同摘要算法摘要明文消息
- 判斷解密后的摘要跟重新生成的摘要比較,若一樣表示消息為損壞玛痊。
上面的流程解釋了簽名文件即用私鑰加密的明文消息的摘要的文件汰瘫。只是第三步怎么把公鑰給接收方,有怎么保證接收方的公鑰不會被他人更換擂煞,為了解決這個問題所以就有了證書混弥。
證書中心(certificate authority,簡稱CA)是一個統(tǒng)一的證書管理機(jī)構(gòu)对省。它管理所有需要發(fā)送數(shù)據(jù)方的公鑰蝗拿,對公鑰進(jìn)行認(rèn)證和加密。認(rèn)證加密后的公鑰蒿涎,即是證書哀托,又稱為CA證書,證書中包含了很多信息劳秋,最重要的是申請者的公鑰仓手。
CA機(jī)構(gòu)在給公鑰加密時,用的是一個統(tǒng)一的密鑰對玻淑,在加密公鑰時嗽冒,用的是其中的私鑰。這樣岁忘,申請者拿到證書后辛慰,在發(fā)送數(shù)據(jù)時,用自己的私鑰生成簽名干像,將簽名帅腌、證書和發(fā)送內(nèi)容一起發(fā)給對方,對方拿到了證書后麻汰,需要對證書解密以獲取到證書中的公鑰速客,解密需要用到CA機(jī)構(gòu)的”統(tǒng)一密鑰對“中的公鑰,這個公鑰也就是我們常說的CA根證書五鲫,通常需要我們到證書頒發(fā)機(jī)構(gòu)去下載并安裝到相應(yīng)的收取數(shù)據(jù)的客戶端溺职,如瀏覽器上面。這個公鑰只需要安裝一次位喂。有了這個公鑰之后浪耘,就可以解密證書,拿到發(fā)送方的公鑰塑崖,然后解密發(fā)送方發(fā)過來的簽名七冲,獲取摘要,重新計算摘要规婆,作對比澜躺,以驗(yàn)證數(shù)據(jù)內(nèi)容的完整性蝉稳。
Apk簽名
Android系統(tǒng)在安裝APK的時候,首先會檢驗(yàn)APK的簽名掘鄙,如果發(fā)現(xiàn)簽名文件不存在或者校驗(yàn)簽名失敗耘戚,則會拒絕安裝,所以應(yīng)用程序在發(fā)布之前一定要進(jìn)行簽名操漠。
給APK簽名可以帶來以下好處:
應(yīng)用程序升級
如果想無縫升級一個應(yīng)用收津,Android系統(tǒng)要求應(yīng)用程序的新版本與老版本具有相同的簽名與包名。若包名相同而簽名不同颅夺,系統(tǒng)會拒絕安裝新版應(yīng)用朋截。應(yīng)用程序模塊化
Android系統(tǒng)可以允許同一個證書簽名的多個應(yīng)用程序在一個進(jìn)程里運(yùn)行,系統(tǒng)實(shí)際把他們作為一個單個的應(yīng)用程序吧黄。此時就可以把我們的應(yīng)用程序以模塊的方式進(jìn)行部署部服,而用戶可以獨(dú)立的升級其中的一個模塊。代碼或數(shù)據(jù)共享
Android提供了基于簽名的權(quán)限機(jī)制拗慨,一個應(yīng)用程序可以為另一個以相同證書簽名的應(yīng)用程序公開自己的功能與數(shù)據(jù)廓八,同時其它具有不同簽名的應(yīng)用程序不可訪問相應(yīng)的功能與數(shù)據(jù)。應(yīng)用程序的可認(rèn)定性
簽名信息中包含有開發(fā)者信息赵抢,在一定程度上可以防止應(yīng)用被偽造剧蹂。例如網(wǎng)易云加密對Android APK加殼保護(hù)中使用的“校驗(yàn)簽名(防二次打包)”功能就是利用了這一點(diǎn)。
簽名的目的:
- 要確定消息的來源確實(shí)是其申明的那個人
- 要保證信息在傳遞的過程中不被第三方篡改烦却,即使被篡改了宠叼,也可以發(fā)覺出來。
簽名原理:
- 對Apk中的每個文件做一次算法(數(shù)據(jù)摘要+Base64編碼)其爵,保存到MANIFEST.MF文件中
- 對MANIFEST.MF整個文件做一次算法(數(shù)據(jù)摘要+Base64編碼)冒冬,存放到CERT.SF文件的頭屬性中,在對MANIFEST.MF文件中每一條記錄做一次算法(數(shù)據(jù)摘要+Base64編碼)摩渺,存放到CERT.SF文件中简烤。
- 對CERT.SF文件做簽名,內(nèi)容存檔到CERT.RSA中摇幻,RSA文件還包含了簽名的公鑰横侦、簽名所有者等信息。
對一個APK文件簽名之后绰姻,APK文件根目錄下會增加META-INF目錄枉侧,該目錄下增加三個文件:
MANIFEST.MF
NETEASE.RSA
NETEASE.SF
.RSA文件還可能是.DSA文件,RSA與SF文件的文件名可以更改狂芋,但是它們的命名必須一樣棵逊。
為什么要這么設(shè)計簽名流程呢?
- 如果你改變了apk包中的任何文件银酗,那么在apk安裝校驗(yàn)時辆影,改變后的文件摘要信息與MANIFEST.MF的檢驗(yàn)信息不同,于是驗(yàn)證失敗黍特,程序就不能成功安裝蛙讥。
- 如果你改變了apk包中的任何文件,那么在apk安裝校驗(yàn)時灭衷,改變后的文件摘要信息與MANIFEST.MF的檢驗(yàn)信息不同次慢,于是驗(yàn)證失敗,程序就不能成功安裝翔曲。
- 如果你還不死心迫像,繼續(xù)計算MANIFEST.MF的摘要值,相應(yīng)的更改CERT.SF里面的值瞳遍,那么數(shù)字簽名值必定與CERT.RSA文件中記錄的不一樣闻妓,還是失敗。
- 那么能不能繼續(xù)偽造數(shù)字簽名呢掠械?不可能由缆,因?yàn)闆]有數(shù)字證書對應(yīng)的私鑰。
所以猾蒂,如果要重新打包后的應(yīng)用程序能再Android設(shè)備上安裝均唉,必須對其進(jìn)行重簽名。只要修改了Apk中的任何內(nèi)容肚菠,就必須重新簽名舔箭,不然會提示安裝失敗。
Https加密通訊過程
HTTPS在傳輸過程中是可以通過加密來保護(hù)數(shù)據(jù)安全的蚊逢,以免用戶敏感信息被第三方獲取层扶。 可以說HTTPS是HTTP的升級版、安全版时捌。
- 瀏覽器請求服務(wù)器地址
- 服務(wù)器返回公鑰
- 瀏覽器驗(yàn)證公鑰是否有效怒医,無效彈框警告,有效生成隨機(jī)秘鑰奢讨,然后用服務(wù)器公鑰加密生成的隨機(jī)秘鑰發(fā)送給服務(wù)端
- 服務(wù)端收到后用私鑰解密出隨機(jī)秘鑰
- 之后服務(wù)端和瀏覽器傳輸數(shù)據(jù)就用隨機(jī)必要加密傳輸
其中瀏覽器驗(yàn)證服務(wù)端證書是TLS協(xié)議的工作稚叹,它是基于TCP協(xié)議。在建立連接的時候先進(jìn)行TCP連接握手拿诸,然后進(jìn)行TLS握手扒袖,過程如下
- 瀏覽器高速服務(wù)端支持的加密算法列表
- 服務(wù)端獲取瀏覽器的加密算法列表,選擇一個亩码,加上證書公鑰給到瀏覽器
- 瀏覽器用服務(wù)端選擇的加密算法用服務(wù)端給的公鑰加密一個隨機(jī)生成的對稱秘鑰給到服務(wù)端
- 服務(wù)端收到后用私鑰解密得到對稱秘鑰季率,發(fā)送用秘鑰解密的信息給瀏覽器,握手結(jié)束描沟。
證書的校驗(yàn)是瀏覽器會預(yù)置一些公認(rèn)的根證書飒泻,拿到服務(wù)端的證書鞭光,然后后倒退到根證書瀏覽器中是否有,如果有則代表證書可信泞遗。如果證書是自己生成的惰许,那需要在瀏覽器安裝