Android之?dāng)?shù)字簽名、數(shù)字證書(shū)

注意:本篇文章是本人閱讀相關(guān)文章所寫(xiě)下的總結(jié),方便以后查閱,所有內(nèi)容非原創(chuàng),侵權(quán)刪。

本篇文章內(nèi)容來(lái)自于:
Android安全加密:數(shù)字簽名和數(shù)字證書(shū)

目錄

  1. 數(shù)字簽名
    --1.1 什么是數(shù)字簽名
    --1.2 數(shù)字簽名過(guò)程
    --1.3 數(shù)字簽名代碼實(shí)現(xiàn)
  2. 數(shù)字證書(shū)
    --2.1 什么是數(shù)字證書(shū)
    --2.2 數(shù)字證書(shū)格式
    --2.3 數(shù)字證書(shū)原理
    --2.4 生成數(shù)字證書(shū)
  3. 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。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,514評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,373評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,975評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,743評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,199評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,414評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,951評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,780評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,218評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,649評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,889評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,673評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,653評(píng)論 25 708
  • Android安全加密專(zhuān)題文章索引 Android安全加密:對(duì)稱(chēng)加密 Android安全加密:非對(duì)稱(chēng)加密 Andr...
    JackChen1024閱讀 2,311評(píng)論 1 23
  • 數(shù)字證書(shū)就是網(wǎng)絡(luò)通訊中標(biāo)志通訊各方身份信息的一系列數(shù)據(jù),其作用類(lèi)似于現(xiàn)實(shí)生活中的身份證。它是由一個(gè)權(quán)威機(jī)構(gòu)發(fā)行的,...
    拉肚閱讀 21,199評(píng)論 1 17
  • 許昕想秦志戩想得發(fā)瘋,秦志戩也想他小朋友。 挑著大蟒直播的幾個(gè)時(shí)間點(diǎn)兒上去看,被不明真相的同事網(wǎng)癮中年、愛(ài)崗敬業(yè)地...
    雙漪閱讀 3,056評(píng)論 0 2
  • 慧行慧影閱讀 158評(píng)論 0 0