Android安全加密專題文章索引
- Android安全加密:對稱加密
- Android安全加密:非對稱加密
- Android安全加密:消息摘要Message Digest
- Android安全加密:數字簽名和數字證書
- Android安全加密:Https編程
一、數字簽名
1. 概述
數字簽名是非對稱加密與數字摘要的組合應用
2. 應用場景
- 校驗用戶身份(使用私鑰簽名倍阐,公鑰校驗仇箱,只要用公鑰能校驗通過,則該信息一定是私鑰持有者發(fā)布的)
- 校驗數據的完整性(用解密后的消息摘要跟原文的消息摘要進行對比)
3. 簽名過程
“發(fā)送報文時惨缆,發(fā)送方用一個哈希函數從報文文本中生成報文摘要,然后用自己的私人密鑰對這個摘要進行加密糜值,這個加密后的摘要將作為報文的數字簽名和報文一起發(fā)送給接收方,接收方首先用與發(fā)送方一樣的哈希函數從接收到的原始報文中計算出報文摘要坯墨,接著再用發(fā)送方的公用密鑰來對報文附加的數字簽名進行解密寂汇,如果這兩個摘要相同、那么接收方就能確認該數字簽名是發(fā)送方的捣染。
數字簽名有兩種功效:一是能確定消息確實是由發(fā)送方簽名并發(fā)出來的骄瓣,因為別人假冒不了發(fā)送方的簽名。二是數字簽名能確定消息的完整性耍攘。因為數字簽名的特點是它代表了文件的特征榕栏,文件如果發(fā)生改變,數字摘要的值也將發(fā)生變化蕾各。不同的文件將得到不同的數字摘要扒磁。一次數字簽名涉及到一個哈希函數、發(fā)送者的公鑰示损、發(fā)送者的私鑰渗磅。”
4. 使用步驟
//獲取signature 對象检访,初始化算法:MD2withRSA, MD5withRSA, or SHA1withRSA
Signature signature = Signature.getInstance("MD5withRSA");
//創(chuàng)建私鑰(從磁盤上讀仁加恪)
PrivateKey privateKey = (PrivateKey)SerializableUtil.readObject(
"heima.privateKey");
//使用私鑰進行初始化
signature.initSign(privateKey);
//傳入需要簽名的數據
signature.update(content.getBytes());
//執(zhí)行簽名
byte[] sign = signature.sign();
//創(chuàng)建公鑰(從磁盤上讀取)
PublicKey publicKey = (PublicKey) SerializableUtil.readObject(
"heima.publicKey");
//使用公鑰進行初始化
signature.initVerify(publicKey);
//傳入需要校驗的數據(即上面的原文)
signature.update(content.getBytes());
//執(zhí)行校驗
boolean verify = signature.verify(sign);
5. 總結
數字簽名一般不單獨使用脆贵,基本都是用在數字證書里實現SSL 通信協(xié)議医清。下面將學習的數字證書就是基于數字簽名技術實現的。
二卖氨、數字證書
1. 概述
數字證書就是互聯(lián)網通訊中標志通訊各方身份信息的一串數字会烙,提供了一種在Internet 上驗證通信實體身份的方式负懦,數字證書不是數字身份證,而是身份認證機構蓋在數字身份證上的一個章或影啬濉(或者說加在數字身份證上的一個簽名)纸厉。它是由權威機構——CA 機構,又稱為證書授權(Certificate Authority)中心發(fā)行的五嫂,人們可以在網上用它來識別對方的身份颗品。
2. 應用場景
- 交易者身份的確定性、不可否認性沃缘、不可修改性
- 對應用進行簽名認證(例如Android 的apk)
3. 數字證書格式
數字證書的格式普遍采用的是X.509V3 國際標準躯枢,一個標準的X.509 數字證書包含以下一些內容:
- 證書的版本信息
- 證書的序列號,每個證書都有一個唯一的證書序列號
- 證書所使用的簽名算法
- 證書的發(fā)行機構名稱槐臀,命名規(guī)則一般采用X.500 格式
- 證書的有效期锄蹂,通用的證書一般采用UTC 時間格式,它的計時范圍為1950-2049
- 證書所有人的名稱水慨,命名規(guī)則一般采用X.500 格式
- 證書所有人的公開密鑰
- 證書發(fā)行者對證書的簽名
4. 數字證書原理
數字證書是安全領域里的終極武器得糜,SSL 通信協(xié)議里最核心的東西就是數字證書。他涉及到前面提到的所有知識:對稱加密讥巡、非對稱加密掀亩、消息摘要、數字簽名等欢顷。
數字證書可以通過java 自帶的KeyTool 工具生成,生成后的數字證書一般保管在KeyStore 里捉蚤。KeyStore可以叫做秘鑰倉庫抬驴。
秘鑰倉庫可以保管3 種類型的數據:KeyStore.PrivateKeyEntry(非對稱機密里的私鑰)、KeyStore.SecretKeyEntry (對稱加密里的秘鑰)缆巧、KeyStore.TrustedCertificateEntry(受信任的證書)
5. KeyTool工具
路徑:jre\bin\keytool.exe
常用命令:
生成keypair
keytool -genkeypair
keytool -genkeypair -alias lisi(后面部分是為證書指定別名布持,否則采用默認的名稱為mykey)
看看keystore 中有哪些項目:
keytool -list 或keytool -list -v
keytool -exportcert -alias lisi -file lisi.cer
生成可打印的證書:
keytool -exportcert -alias lisi -file lisi.cer –rfc
顯示數字證書文件中的證書信息:
keytool -printcert -file lisi.cer
直接雙擊lisi.cer,用window 系統(tǒng)的內置程序打開lisi.cer
6. Android 的keystore 相關知識
debug 簽名路徑:user.android\debug.keystore
debug.keystore 的別名(alias)及密碼:
別名:androiddebugkey陕悬,密碼:android
簽名命令(jdk1.6):
jarsigner -verbose -keystore debug.keystore -signedjar 1signed.apk 1.apk androiddebugkey
簽名命令(jdk1.7):
jarsigner -verbose -keystore debug.keystore -signedjar 1signed.apk 1.apk androiddebugkey -digestalg
SHA1 -sigalg MD5withRSA
優(yōu)化命令:
zipalign -v 4 1signed.apk 1signedaligned.apk
驗證簽名是否成功:
jarsigner -verify 1signed.apk
7. 補充
簽名證書
由權威頒發(fā)機構頒發(fā)給服務器或者個人用于證明自己身份的東西题暖,默認客戶端都是信任的。主要目的是用來加密和保證數據的完整性和不可抵賴性
例如根證書機構Symantec 頒發(fā)給百度的就是簽名證書捉超,是受信任的胧卤。
自簽名證書
由服務器自己頒發(fā)給自己,用于證明自己身份的東西拼岳,非權威頒發(fā)機構發(fā)布枝誊,默認客戶端都是不信任的,主要目的是用來加密和保證數據的完整性和不可抵賴性,與簽名證書相同.
例如中鐵集團(SRCA)辦法給12306 的證書就是自簽名證書惜纸,自己給自己頒發(fā)的叶撒。
三绝骚、Android簽名機制
1、什么是簽名祠够?
Android要求所有已安裝的應用程序都使用數字證書做數字簽名压汪,數字證書的私鑰由開發(fā)者持有。Android使用數字證書作為標識應用程序開發(fā)者的一種方式古瓤,并在應用程序之間建立信任的關系止剖,證書并不用來控制用戶能否安裝那個應用程序,證書不需要有證書認證中心簽名湿滓,完全可以使用自簽名證書(seft-signed certificates)
沒有正確簽名的應用滴须,Android系統(tǒng)不會安裝或運行,此規(guī)則適用于任何地方運行的Android系統(tǒng)叽奥,不管是在模擬器還是在真實設備上扔水。因為這個原因,在真機或模擬器上運行或調試應用前朝氓,必須為其設置好簽名魔市。
2、為什么需要簽名赵哲?
開發(fā)Android的人很多待德,完全可以把包名,類名起成同樣的名字枫夺,這時候如何區(qū)分将宪?簽名可以區(qū)分開發(fā)商或者惡意的開發(fā)者可以通過相同的包名混淆替換已安裝應用。簽名可以保證相同包名但是簽名不同的包不被替換橡庞。
應用如果使用一種key簽名较坛,另外一個key簽名的文件將無法安裝或覆蓋老的版本。防止已安裝的應用被惡意的第三方覆蓋或替換扒最。簽名可以防止交易抵賴
3丑勤、Android簽名機制
在Android 系統(tǒng)中,所有安裝到系統(tǒng)的應用程序都必有一個數字證書吧趣,此數字證書用于標識應用程序的作者和在應用程序之間建立信任關系法竞。
Android 系統(tǒng)要求每一個安裝進系統(tǒng)的應用程序都是經過數字證書簽名的,數字證書的私鑰則保存在程序開發(fā)者的手中强挫。
Android 將數字證書用來標識應用程序的作者和在應用程序之間建立信任關系岔霸,不是用來決定最終用戶可以安裝哪些應用程序。
這個數字證書并不需要權威的數字證書簽名機構認證(CA)纠拔,它只是用來讓應用程序包自我認證的秉剑。
同一個開發(fā)者的多個程序盡可能使用同一個數字證書,這可以帶來以下好處稠诲。
有利于程序升級侦鹏,當新版程序和舊版程序的數字證書相同時诡曙,Android 系統(tǒng)才會認為這兩個程序是同一個程序的不同版本。如果新版程序和舊版程序的數字證書不相同略水,則Android 系統(tǒng)認為他們是不同的程序价卤,并產生沖突,會要求新程序更改包名渊涝。
有利于程序的模塊化設計和開發(fā)慎璧。Android 系統(tǒng)允許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視為同一個程序跨释。所以開發(fā)者可以將自己的程序分模塊開發(fā)胸私,而用戶只需要在需要的時候下載適當的模塊
在簽名時,需要考慮數字證書的有效期
數字證書的有效期要包含程序的預計生命周期鳖谈,一旦數字證書失效岁疼,持有改數字證書的程序將不能正常升級。
如果多個程序使用同一個數字證書缆娃,則該數字證書的有效期要包含所有程序的預計生命周期捷绒。
Android Market 強制要求所有應用程序數字證書的有效期要持續(xù)到2033 年10 月22 日以后。
Android 數字證書包含以下幾個要點
所有的應用程序都必須有數字證書贯要,Android 系統(tǒng)不會安裝一個沒有數字證書的應用程序
Android 程序包使用的數字證書可以是自簽名的暖侨,不需要一個權威的數字證書機構簽名認證
如果要正式發(fā)布一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名崇渗,而不能使用adt 插件或者ant 工具生成的調試證書來發(fā)布
數字證書都是有有效期的字逗,Android 只是在應用程序安裝的時候才會檢查證書的有效期。如果程序已經安裝在系統(tǒng)中宅广,即使證書過期也不會影響程序的正常功能
4扳肛、Android簽名過程
創(chuàng)建證書
5、Android APP 升級流程
簽名沖突:
如果兩個應用程序, 包名相同, 但是簽名不同, 就無法覆蓋安裝
正式簽名:
- 有效期比較長乘碑,一般大于25年
- 需要設置密碼
- 正式發(fā)布應用時,必須用正式簽名來打包
測試簽名(debug.keystore)
- 有效期是1年金拒,很短
- 有默認的別名兽肤,密碼,alias=android绪抛,密碼是androiddebugkey
- 在Android Studio中直接運行項目是,系統(tǒng)默認采用此簽名文件
如果正式簽名丟失了怎么辦?
- 修改包名资铡,發(fā)布,會發(fā)現有兩個手機衛(wèi)士幢码,用戶會比較糾結
- 請用戶先刪掉原來的版本笤休,再進行安裝,用戶會流失
- 作為一名有經驗的開發(fā)人員症副,請不要犯這種低級錯誤