注意:本篇文章是本人閱讀相關(guān)文章所寫(xiě)下的總結(jié),方便以后查閱,所有內(nèi)容非原創(chuàng),侵權(quán)刪。
本篇文章內(nèi)容來(lái)自于:
Android安全加密:數(shù)字簽名和數(shù)字證書(shū)
目錄
- 數(shù)字簽名
--1.1 什么是數(shù)字簽名
--1.2 數(shù)字簽名過(guò)程
--1.3 數(shù)字簽名代碼實(shí)現(xiàn) - 數(shù)字證書(shū)
--2.1 什么是數(shù)字證書(shū)
--2.2 數(shù)字證書(shū)格式
--2.3 數(shù)字證書(shū)原理
--2.4 生成數(shù)字證書(shū) - Android簽名機(jī)制
--3.1 Android上的簽名是什么樣的?
--3.2 Android為什么要簽名?
--3.3 盡可能使用同一個(gè)簽名
1. 數(shù)字簽名
1.1 什么是數(shù)字簽名
數(shù)字簽名是非對(duì)稱(chēng)加密與數(shù)字摘要的組合應(yīng)用
應(yīng)用場(chǎng)景:
- 校驗(yàn)用戶(hù)身份(使用私鑰簽名,公鑰校驗(yàn),只要用公鑰能校驗(yàn)通過(guò),則該信息一定是私鑰持有者發(fā)布的)
- 校驗(yàn)數(shù)據(jù)的完整性(用解密后的消息摘要跟原文的消息摘要進(jìn)行對(duì)比)
1.2 數(shù)字簽名過(guò)程
發(fā)送報(bào)文時(shí),發(fā)送方用一個(gè)哈希函數(shù)從報(bào)文文本中生成報(bào)文摘要,然后用自己的私人密鑰對(duì)這個(gè)摘要進(jìn)行加密,這個(gè)加密后的摘要將作為報(bào)文的數(shù)字簽名和報(bào)文一起發(fā)送給接收方,
接收方首先用與發(fā)送方一樣的哈希函數(shù)從接收到的原始報(bào)文中計(jì)算出報(bào)文摘要,接著再用發(fā)送方的公用密鑰來(lái)對(duì)報(bào)文附加的數(shù)字簽名進(jìn)行解密,如果這兩個(gè)摘要相同、那么接收方就能確認(rèn)該數(shù)字簽名是發(fā)送方的。
數(shù)字簽名有兩種功效:
一是能確定消息確實(shí)是由發(fā)送方簽名并發(fā)出來(lái)的,因?yàn)閯e人假冒不了發(fā)送方的簽名。
二是數(shù)字簽名能確定消息的完整性。因?yàn)閿?shù)字簽名的特點(diǎn)是它代表了文件的特征,文件如果發(fā)生改變,數(shù)字摘要的值也將發(fā)生變化。不同的文件將得到不同的數(shù)字摘要。一次數(shù)字簽名涉及到一個(gè)哈希函數(shù)、發(fā)送者的公鑰、發(fā)送者的私鑰。
1.3 數(shù)字簽名代碼實(shí)現(xiàn)
String content = "dkjfaldfjdws";
String content1 = "dkjfaldfjdwsda";
//獲得私鑰和公鑰
KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
//===進(jìn)行數(shù)字簽名===
//獲取signature 對(duì)象,初始化算法:MD2withRSA, MD5withRSA, or SHA1withRSA
Signature signature = Signature.getInstance("MD5withRSA");
//使用私鑰進(jìn)行初始化
signature.initSign(privateKey);
//傳入需要簽名的數(shù)據(jù)
signature.update(content.getBytes());
//執(zhí)行簽名
byte[] sign = signature.sign();
//===校驗(yàn)簽名===
//使用公鑰進(jìn)行初始化
signature.initVerify(publicKey);
//傳入需要校驗(yàn)的數(shù)據(jù)(即上面的原文)
signature.update(content1.getBytes());
//執(zhí)行校驗(yàn)
boolean verify = signature.verify(sign);
Log.d("xl", verify+"");
數(shù)字簽名一般不單獨(dú)使用,基本都是用在數(shù)字證書(shū)里實(shí)現(xiàn)SSL 通信協(xié)議。
2. 數(shù)字證書(shū)
2.1 什么是數(shù)字證書(shū)
數(shù)字證書(shū)就是互聯(lián)網(wǎng)通訊中標(biāo)志通訊各方身份信息的一串?dāng)?shù)字,提供了一種在Internet 上驗(yàn)證通信實(shí)體身份的方式,數(shù)字證書(shū)不是數(shù)字身份證,而是身份認(rèn)證機(jī)構(gòu)蓋在數(shù)字身份證上的一個(gè)章或?。ɑ蛘哒f(shuō)加在數(shù)字身份證上的一個(gè)簽名)。它是由權(quán)威機(jī)構(gòu)——CA 機(jī)構(gòu),又稱(chēng)為證書(shū)授權(quán)(Certificate Authority)中心發(fā)行的,人們可以在網(wǎng)上用它來(lái)識(shí)別對(duì)方的身份。
應(yīng)用場(chǎng)景
- 交易者身份的確定性、不可否認(rèn)性、不可修改性
- 對(duì)應(yīng)用進(jìn)行簽名認(rèn)證(例如Android 的apk)
2.2 數(shù)字證書(shū)格式
數(shù)字證書(shū)的格式普遍采用的是X.509V3 國(guó)際標(biāo)準(zhǔn),一個(gè)標(biāo)準(zhǔn)的X.509 數(shù)字證書(shū)包含以下一些內(nèi)容:
- 證書(shū)的版本信息
- 證書(shū)的序列號(hào),每個(gè)證書(shū)都有一個(gè)唯一的證書(shū)序列號(hào)
- 證書(shū)所使用的簽名算法
- 證書(shū)的發(fā)行機(jī)構(gòu)名稱(chēng),命名規(guī)則一般采用X.500 格式
- 證書(shū)的有效期,通用的證書(shū)一般采用UTC 時(shí)間格式,它的計(jì)時(shí)范圍為1950-2049
- 證書(shū)所有人的名稱(chēng),命名規(guī)則一般采用X.500 格式
- 證書(shū)所有人的公開(kāi)密鑰
- 證書(shū)發(fā)行者對(duì)證書(shū)的簽名
2.3 數(shù)字證書(shū)原理
數(shù)字證書(shū)是安全領(lǐng)域里的終極武器,SSL 通信協(xié)議里最核心的東西就是數(shù)字證書(shū)。他涉及到前面提到的所有知識(shí):對(duì)稱(chēng)加密、非對(duì)稱(chēng)加密、消息摘要、數(shù)字簽名等。
2.4 生成數(shù)字證書(shū)
數(shù)字證書(shū)可以通過(guò)java 自帶的KeyTool 工具生成,生成后的數(shù)字證書(shū)一般保管在KeyStore 里。KeyStore可以叫做秘鑰倉(cāng)庫(kù)。
關(guān)于keytool的使用可以百度,或者參考Android安全加密:數(shù)字簽名和數(shù)字證書(shū)
秘鑰倉(cāng)庫(kù)可以保管3 種類(lèi)型的數(shù)據(jù):KeyStore.PrivateKeyEntry(非對(duì)稱(chēng)機(jī)密里的私鑰)、KeyStore.SecretKeyEntry (對(duì)稱(chēng)加密里的秘鑰)、KeyStore.TrustedCertificateEntry(受信任的證書(shū))
3. Android簽名機(jī)制
3.1 Android上的簽名是什么樣的?
Android要求所有已安裝的應(yīng)用程序都使用數(shù)字證書(shū)做數(shù)字簽名,數(shù)字證書(shū)的私鑰由開(kāi)發(fā)者持有。
沒(méi)有正確簽名的應(yīng)用,Android系統(tǒng)不會(huì)安裝或運(yùn)行。
debug版本有debug.keystore證書(shū)
release版本有自己創(chuàng)建的證書(shū)(打包的時(shí)候設(shè)置)
3.2 Android為什么要簽名?
簽名可以保證相同包名但是簽名不同的包不被替換。
應(yīng)用如果使用一種key簽名,另外一個(gè)key簽名的文件將無(wú)法安裝或覆蓋老的版本,防止已安裝的應(yīng)用被惡意的第三方覆蓋或替換。
3.3 盡可能使用同一個(gè)簽名
同一個(gè)開(kāi)發(fā)者的多個(gè)程序盡可能使用同一個(gè)數(shù)字證書(shū),這可以帶來(lái)以下好處。
- 有利于程序升級(jí),當(dāng)新版程序和舊版程序的數(shù)字證書(shū)相同時(shí),Android 系統(tǒng)才會(huì)認(rèn)為這兩個(gè)程序是同一個(gè)程序的不同版本。如果新版程序和舊版程序的數(shù)字證書(shū)不相同,則Android 系統(tǒng)認(rèn)為他們是不同的程序,并產(chǎn)生沖突,會(huì)要求新程序更改包名。
- 有利于程序的模塊化設(shè)計(jì)和開(kāi)發(fā)。Android 系統(tǒng)允許擁有同一個(gè)數(shù)字簽名的程序運(yùn)行在一個(gè)進(jìn)程中,Android程序會(huì)將他們視為同一個(gè)程序。所以開(kāi)發(fā)者可以將自己的程序分模塊開(kāi)發(fā),而用戶(hù)只需要在需要的時(shí)候下載適當(dāng)?shù)哪K。