数字签名相关
一些人說(shuō)android只支持BKS證書(shū)。不知道真還是假,所以首先創(chuàng)建了BKS證書(shū)。
步驟:
1、下載bcprov-jdk16-141.jar,放到\jre\lib\ext目錄下
2、修改文件 ?jre6\lib\security\java.security, 在文件中添加: ?security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
? ?在這個(gè)文件中找到security.provider字樣,后面序號(hào)遞增,本機(jī)遞增到10
3、創(chuàng)建keystore。命令:
? ? ? keytool -genkey -alias <別名> -keypass <密鑰口令> ?-keyalg Test -keysize 1024 -validity 365 -keystore <庫(kù)文件名,如runcerts.keystore> -storepass <證書(shū)庫(kù)密碼> -dname "cn=testUsr, ou=產(chǎn)品部, o=XXX公司, c=CN, S=shandong" -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
?4、簽名及驗(yàn)證
? ?//讀取密鑰庫(kù):
? ?FileInputStream is=new FileInputStream("C:\\Inetpub\\runcerts.keystore");
? ? KeyStore ks=KeyStore.getInstance("BKS","BC");
? ? ks.load(is,"123456".toCharArray());
? ?is.close();
??
//讀取私鑰
?PrivateKey priKey1=(PrivateKey)ks.getKey("test2", "123456".toCharArray());
? privateKeyString =getKeyString(priKey1);
//簽名
? ?SignText=DataSign(plainText,privateKeyString);?
//以下驗(yàn)證 ?
? ? //獲得證書(shū)
? Certificate certificate=ks.getCertificate("test2");
? //獲得證書(shū)
? PublicKey publicKey1=certificate.getPublicKey();
??
? publicKeyString=getKeyString(publicKey1);
??
//驗(yàn)證
? byte[]plainText1="Happy New Year!!Email:@qq.com".getBytes();?
? boolean verySign=verify(plainText1,publicKeyString,SignText);
? String s2 = new Boolean(verySign).toString();
? System.out.print("驗(yàn)證結(jié)果:"+s2+"/n");
?
說(shuō)明:大體是這個(gè)步驟,具體還有一些細(xì)節(jié)代碼沒(méi)有粘貼。
?
Android應(yīng)用數(shù)字簽名詳解
標(biāo)簽: androidandroid studiokeytool-簽名
2015-11-26 15:23 5163人閱讀 評(píng)論(0) 收藏 舉報(bào)
? 分類:
Android應(yīng)用開(kāi)發(fā)(94) ?
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]
目錄
? 目錄
? 概述
? 數(shù)字簽名證書(shū)生成方法
o 命令行工具keytooljarsinger
o Android Studio
o 小結(jié)
? 查看應(yīng)用簽名信息
o 查看自簽名證書(shū)的信息
o 查看第三方應(yīng)用或Android系統(tǒng)應(yīng)用簽名證書(shū)信息
________________________________________
概述
Android系統(tǒng)要求所有的應(yīng)用必須被證書(shū)進(jìn)行數(shù)字簽名之后才能進(jìn)行安裝。android系統(tǒng)通過(guò)該證書(shū)來(lái)確認(rèn)應(yīng)用的作者,該證書(shū)是不需要權(quán)威機(jī)構(gòu)認(rèn)證的,一般情況下應(yīng)用都是用開(kāi)發(fā)者的自簽名證書(shū),該證書(shū)是確保應(yīng)用程序和應(yīng)用程序作者之間建立信任關(guān)系,而不是用來(lái)決定用戶可以安裝哪些應(yīng)用程序。
應(yīng)用進(jìn)行數(shù)字簽名的好處和注意事項(xiàng)如下:
1. Android所有的應(yīng)用程序必須要有數(shù)字證書(shū)簽名,Android系統(tǒng)不會(huì)安裝一個(gè)沒(méi)有數(shù)字證書(shū)簽名的程序。
2. Android系統(tǒng)中,系統(tǒng)app使用的是平臺(tái)證書(shū)簽名,而第三方app一般使用開(kāi)發(fā)者的自簽名證書(shū)。
3. Release版本的第三方app(例如淘寶、支付寶、微信),必須使用一個(gè)合適私鑰生成的數(shù)字證書(shū)來(lái)給程序進(jìn)行簽名,并且保證每次的迭代新版本都是使用相同的證書(shū)進(jìn)行數(shù)字簽名。不然的話,新版本和舊版本的數(shù)字證書(shū)不一致,Android系統(tǒng)會(huì)認(rèn)為這是兩個(gè)不同的app,導(dǎo)致更新等操作失敗。
4. 數(shù)字證書(shū)是存在有效期的,這也決定了app的預(yù)計(jì)生命周期,如果數(shù)字證書(shū)超期失效,則應(yīng)用無(wú)法安裝或者無(wú)法正常升級(jí)。
5. Android提供了基于簽名的權(quán)限機(jī)制,那么一個(gè)應(yīng)用程序就可以為另一個(gè)以相同證書(shū)簽名的應(yīng)用程序公開(kāi)自己的功能。以同一個(gè)證書(shū)對(duì)多個(gè)應(yīng)用程序進(jìn)行簽名,利用基于簽名的權(quán)限檢查,你就可以在應(yīng)用程序間以安全的方式共享代碼和數(shù)據(jù)了。 不同的應(yīng)用程序之間,想共享數(shù)據(jù),或者共享代碼,那么要讓他們運(yùn)行在同一個(gè)進(jìn)程中,而且要讓他們用相同的證書(shū)簽名。
________________________________________
數(shù)字簽名證書(shū)生成方法
聲明:實(shí)驗(yàn)生成的keystore只是作為演示使用,并沒(méi)有實(shí)際應(yīng)用到項(xiàng)目中。大家參考時(shí)也要根據(jù)我的博客手工修改部分參數(shù),切忌無(wú)腦照抄!
Android是使用標(biāo)準(zhǔn)的Java工具keytool和jarsigner來(lái)生成數(shù)字證書(shū),而目前市場(chǎng)上第三方IDE(Android Studio和Eclipse)都是通過(guò)圖形化系統(tǒng)幫我們封裝了這兩個(gè)工具的具體執(zhí)行步驟。?
接下來(lái),我會(huì)介紹兩種生成數(shù)字簽名證書(shū)的方式,分別通過(guò)命令行和Android Studio進(jìn)行生成。
________________________________________
命令行工具(keytool&&jarsinger)
由于Android的數(shù)字簽名證書(shū)是用java標(biāo)準(zhǔn)工具生成的(路徑為:$JAVA_HOME/bin目錄下),那我們當(dāng)然可以在命令行生成數(shù)字證書(shū)了,具體方法如下。
1. 使用keytool生成數(shù)字簽名證書(shū)。示例命令如下:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
? 1
? 1
參數(shù)詳解:
? -keystore : 指定生成數(shù)字簽名證書(shū)的文件名和路徑。
? -alias:指定證書(shū)的別名。
? -keyalg:指定生成證書(shū)所需要的算法。
? -keysize:指定證書(shū)大小。
? -validity:指定證書(shū)的有效期,單位為天。
示例截圖如下:?
?
1. 使用生成的keystore,利用jarsinger為應(yīng)用進(jìn)行簽名。示例命令如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
? 1
? 1
參數(shù)詳解:
? -sigalg:簽名算法的名稱。
? -digestalg:摘要算法的名稱。
? -keystore : 指定簽名證書(shū)的位置。
? alias_name:簽名證書(shū)的別名。
示例截圖如下:
?
1. google官方同時(shí)推薦使用zipalign工具對(duì)簽名的apk進(jìn)行優(yōu)化。該工具位于Android SDK的/build-tools/版本號(hào)/目錄下。示例命令如下:
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
? 1
? 1
示例截圖如下:?
?
________________________________________
Android Studio
使用命令行的方式可以顯得geek,并且讓我們更多的了解實(shí)現(xiàn)細(xì)節(jié)。但是,平時(shí)應(yīng)用開(kāi)發(fā)中更多的是注重效率,因此,我們可以采用目前google官方推薦的AS幫我們實(shí)現(xiàn)應(yīng)用數(shù)字簽名功能。具體步驟如下。
1. 選擇編譯Module->Build->Generate Signed APK->選擇編譯Module->Next。
?
1. 選擇Create new,創(chuàng)建一個(gè)新的數(shù)字簽名證書(shū)。?
?
2. 填寫(xiě)證書(shū)信息。?
?
填寫(xiě)完成之后,我們點(diǎn)擊OK,就可以生成我們的數(shù)字簽名證書(shū)了。
上述工作完成后,我們就生成了數(shù)字簽名證書(shū),但是還沒(méi)有對(duì)我們的apk進(jìn)行簽名。想要用生成的數(shù)字證書(shū)對(duì)apk進(jìn)行簽名,還需要修改當(dāng)前Module的build.gradle文件,增加簽名命令,具體內(nèi)容如下:
android {
? ? compileSdkVersion 19
? ? buildToolsVersion "19.1.0"
? ? defaultConfig {
? ? ? ? applicationId "××××××"
? ? ? ? minSdkVersion 8
? ? ? ? targetSdkVersion 19
? ? }
? ? signingConfigs {
? ? ? ? debug {
? ? ? ? ? ? // 配置debug版本的數(shù)字簽名證書(shū)
? ? ? ? ? ? storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
? ? ? ? ? ? storePassword "123456"
? ? ? ? ? ? keyAlias "release-key"
? ? ? ? ? ? keyPassword "123456"
? ? ? ? }
? ? ? ? release {
? ? ? ? ? ? // 配置release版本的數(shù)字簽名證書(shū)(為了方便,這里的release版本和debug版本共用一個(gè)數(shù)字簽名證書(shū))
? ? ? ? ? ? storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
? ? ? ? ? ? storePassword "123456"
? ? ? ? ? ? keyAlias "release-key"
? ? ? ? ? ? keyPassword "123456"
? ? ? ? }
? ? }
? ? buildTypes {
? ? ? ? release {
? ? ? ? ? ? // 配置release版本的數(shù)字簽名
? ? ? ? ? ? signingConfig signingConfigs.release
? ? ? ? ? ? minifyEnabled false
? ? ? ? ? ? proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
? ? ? ? }
? ? ? ? debug {
? ? ? ? ? ? // 配置debug版本的數(shù)字簽名
? ? ? ? ? ? signingConfig signingConfigs.debug
? ? ? ? }
? ? }
? ? lintOptions {
? ? ? ? abortOnError false
? ? }
}
? 1
? 2
? 3
? 4
? 5
? 6
? 7
? 8
? 9
? 10
? 11
? 12
? 13
? 14
? 15
? 16
? 17
? 18
? 19
? 20
? 21
? 22
? 23
? 24
? 25
? 26
? 27
? 28
? 29
? 30
? 31
? 32
? 33
? 34
? 35
? 36
? 37
? 38
? 39
? 40
? 41
? 42
? 43
? 1
? 2
? 3
? 4
? 5
? 6
? 7
? 8
? 9
? 10
? 11
? 12
? 13
? 14
? 15
? 16
? 17
? 18
? 19
? 20
? 21
? 22
? 23
? 24
? 25
? 26
? 27
? 28
? 29
? 30
? 31
? 32
? 33
? 34
? 35
? 36
? 37
? 38
? 39
? 40
? 41
? 42
? 43
當(dāng)然,上述命令A(yù)ndroid Studio也提供了圖形化界面進(jìn)行操作,可以直接在Module Settings進(jìn)行設(shè)置,截圖如下(ps:我還是喜歡手動(dòng)配置)。?
?
________________________________________
小結(jié)
Android應(yīng)用可以在debug和release兩種模式下進(jìn)行數(shù)字證書(shū)簽名。在Android Studio中,我們直接點(diǎn)擊Run使用的是debug模式,我們?cè)诿钚星脫鬮ash gradle :$module_name:build使用的是release模式。?
debug模式下簽名是為了開(kāi)發(fā)調(diào)試,release模式下進(jìn)行簽名則是為了正式發(fā)布。?
Android SDK提供了一個(gè)不需要密碼的證書(shū)用于在debug模式下進(jìn)行簽名調(diào)試,默認(rèn)存儲(chǔ)在$HOME/.android/debug.keystore,但是release版本必須使用自己的數(shù)字簽名證書(shū)。
________________________________________
查看應(yīng)用簽名信息
首先,為什么我們需要查看應(yīng)用簽名信息呢?
是因?yàn)?#xff0c;很多第三方提供的SDK服務(wù)為了區(qū)分應(yīng)用必須讓我們提供數(shù)字簽名的SHA1值,例如百度地圖定位SDK、高德地圖定位SDK,為了使用這些服務(wù),我們就必須學(xué)會(huì)如何查看應(yīng)用簽名信息。
________________________________________
查看自簽名證書(shū)的信息
我們自簽名的證書(shū),由于keystore文件存在于我們可訪問(wèn)的路徑下,我們可以直接通過(guò)keytool命令去查看證書(shū)信息。
示例命令如下:
keytool -v -list -keystore ?my-release-key.keystore
? 1
? 1
輸入命令后,是需要輸入簽名密碼的。
參數(shù)詳解:
? -list:列出密鑰庫(kù)中的條目。
? -keystore:數(shù)字證書(shū)位置。
示例截圖如下:?
?
________________________________________
查看第三方應(yīng)用或Android系統(tǒng)應(yīng)用簽名證書(shū)信息
其實(shí)系統(tǒng)應(yīng)用對(duì)開(kāi)發(fā)者來(lái)說(shuō)也是第三方應(yīng)用,但是只要我們能拿到它的apk,就能知道它的應(yīng)用簽名信息。以我目前使用的樂(lè)運(yùn)動(dòng)apk為例(com.oxygen.www_3.0_40.apk)。
1. 用unzip命令解壓apk。
unzip com.oxygen.www_3.0_40.apk
? 1
? 1
1. 進(jìn)入META-INF文件,找到其中的CERT.RSA文件。
2. 使用keytool工具進(jìn)行信息查看,具體命令如下:
keytool -printcert -file CERT.RSA
? 1
? 1
參數(shù)詳解:
? -printcert:打印證書(shū)內(nèi)容
示例截圖如下:?
?
?
加密解密,數(shù)字簽名及證書(shū)
標(biāo)簽: 解密
2016-12-12 16:43 1129人閱讀 評(píng)論(0) 收藏 舉報(bào)
? 分類:
加密解密 android開(kāi)發(fā)(28) ?
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]
對(duì)稱加密
分類
1. 數(shù)據(jù)加密標(biāo)準(zhǔn)DES(56位密鑰長(zhǎng)度,密鑰太短,抗窮舉能力差,安全性不夠)
2. 三重DES-DESede(112和168兩種密鑰長(zhǎng)度,抗窮舉能力顯著增強(qiáng), 但由于進(jìn)行了多重des迭代,造成處理速度慢,效率不高)
3. 高級(jí)數(shù)據(jù)加密標(biāo)準(zhǔn)AES(128和192及256三種密鑰長(zhǎng)度,搞窮舉能力強(qiáng),速度比des系列加密快,為替代des系列加密算法而生)
對(duì)稱加密步驟
1. 由消息傳遞雙方約定密鑰
2. 消息發(fā)送方使用密鑰對(duì)明文加密,并將密文發(fā)送給接收方
3. 消息接收方使用密鑰對(duì)密文解密獲取明文
?
對(duì)稱加密的問(wèn)題
1. 甲與乙通信,甲乙事先需要打電話或者發(fā)郵件或者面對(duì)面約定密鑰key1
2. 甲與丙通信,甲丙事先需要打電話或者發(fā)郵件或者面對(duì)面約定密鑰key2
3. 甲與丁通信,甲丁事先需要打電話或者發(fā)郵件或者面對(duì)面約定密鑰key3
如果甲要與N方通信,就得事先打電話或者發(fā)郵件或者面對(duì)面與N方約定N個(gè)密鑰,以瀏覽器為例,其會(huì)與數(shù)不清的網(wǎng)站通信,瀏覽器開(kāi)發(fā)者不可能事先打電話或者發(fā)郵件或者面對(duì)面與各個(gè)網(wǎng)站開(kāi)發(fā)者約定密鑰。
所以問(wèn)題來(lái)了,通信兩方該如何事先約定密鑰呢,顯然打電話或者發(fā)郵件或者面對(duì)面這種人工約定密鑰的方式是不可行的,這時(shí)需要非對(duì)稱加密算法來(lái)解決這個(gè)問(wèn)題了。
非對(duì)稱加密
分類
非對(duì)稱加密算法也比較多,典型常用的有dsa,rsa算法
特點(diǎn)
1. 每個(gè)通信方都有一對(duì)密鑰,公鑰和私鑰,公鑰對(duì)外公開(kāi),私鑰自己保存不對(duì)外公開(kāi)
2. 公鑰加密的數(shù)據(jù)必須用其對(duì)應(yīng)的私鑰才能解密,私鑰加密的數(shù)據(jù)必須用其對(duì)應(yīng)的公鑰才能解密
非對(duì)稱加密的這些特點(diǎn),即可解決上述人工交換對(duì)稱加密算法密鑰的問(wèn)題,具體見(jiàn)下圖
加密流程
?
以上就是對(duì)數(shù)據(jù)加密的介紹,可以看到,數(shù)據(jù)加密可以保證縱使數(shù)據(jù)被敵人竊取,也無(wú)法識(shí)別出具體內(nèi)容,達(dá)到數(shù)據(jù)的保密性。但假如竊取者將這個(gè)無(wú)法識(shí)別的數(shù)據(jù)替掉,換成具有誤導(dǎo)性錯(cuò)誤的數(shù)據(jù)發(fā)送給數(shù)據(jù)接收方,那么數(shù)據(jù)接收方該如何識(shí)別收到的數(shù)據(jù)是否真實(shí)的,沒(méi)有被竄改的呢?如下圖這種情況
?
要解決上面問(wèn)題,需要利用數(shù)據(jù)摘要和簽名對(duì)數(shù)據(jù)進(jìn)行完整性驗(yàn)證及身份識(shí)別
數(shù)據(jù)摘要
定義
固名思義,就是取數(shù)據(jù)的摘要,大綱,特征碼
分類
主要有md系列和sha系列算法?
1. md系列又分md2,md4,md5等,比較常用的就是md5,無(wú)論數(shù)據(jù)有多長(zhǎng),md算法都會(huì)生成一個(gè)128位的摘要,來(lái)表征這個(gè)數(shù)據(jù)。?
2. sha系列也分很多種,sha-0,sha-1,sha-2,sha-256等等,常用的是sha-1算法,其會(huì)對(duì)數(shù)據(jù)生成一個(gè)160位的摘要,來(lái)表征這個(gè)數(shù)據(jù)。
摘要算法驗(yàn)證數(shù)據(jù)完整性流程
1. 通信雙方約定摘要算法
2. 數(shù)據(jù)發(fā)送方獲取數(shù)據(jù)的摘要m,將數(shù)據(jù)和其摘要m一起發(fā)給接收方
3. 接收方取得獲取的數(shù)據(jù),并利用約定的摘要算法計(jì)算數(shù)據(jù)的摘要m2,與收到的摘要m比較,相等說(shuō)明數(shù)據(jù)沒(méi)有被更改
但上述驗(yàn)證其實(shí)是有bug的,見(jiàn)如下圖?
?
如何解決bug了,這時(shí)需要用到mac算法
MAC消息認(rèn)證碼算法
MAC是結(jié)合了摘要和對(duì)稱加密算法的摘要算法(個(gè)人認(rèn)為也是一種簽名算法,后面會(huì)看不到其不僅可以驗(yàn)證完整性還可以認(rèn)證數(shù)據(jù)源),可以認(rèn)為就是相比前的摘要算法多了一步,就是對(duì)摘要結(jié)果進(jìn)行一次加密后的數(shù)據(jù)作為最終結(jié)果。
分類
主要有HmacMD5, HMacSHA1, HMacSH256, HMacSHA384等等,與前面的摘要算法都是對(duì)應(yīng)的
mac消息認(rèn)證算法驗(yàn)證數(shù)據(jù)完整性流程
1. 通信雙方約定mac算法和密鑰
2. 數(shù)據(jù)發(fā)送方獲取數(shù)據(jù)的認(rèn)證碼m,將數(shù)據(jù)和其認(rèn)證碼m一起發(fā)給接收方
3. 接收方取得傳來(lái)的數(shù)據(jù),并利用約定的mac算法和密鑰計(jì)算數(shù)據(jù)的認(rèn)證碼m2,與收到的認(rèn)證碼m比較,相等說(shuō)明數(shù)據(jù)沒(méi)有被更改
看上去與摘要驗(yàn)證流程相比沒(méi)有差別,就多了一個(gè)密鑰,但就是多的這個(gè)密鑰,解決了前面摘要算法進(jìn)行數(shù)據(jù)完整性驗(yàn)性的bug,具體見(jiàn)下圖
?
另外從上圖也可以看出,mac消息認(rèn)證碼不僅可以驗(yàn)證數(shù)據(jù)完整性,還可以認(rèn)證數(shù)據(jù)發(fā)送方身份,因?yàn)閙ac所用的密鑰只有通信雙方才知道,截竊不知道這個(gè)key就無(wú)法生成正確的code,數(shù)據(jù)接收方就無(wú)法通過(guò)驗(yàn)證。當(dāng)數(shù)據(jù)接收方一旦通過(guò)了驗(yàn)證,不僅說(shuō)明數(shù)據(jù)是完整的,并且說(shuō)明數(shù)據(jù)發(fā)送方?jīng)]有被委造。
數(shù)字簽名
什么是數(shù)字簽名
數(shù)字簽名可以認(rèn)為是帶密鑰的數(shù)據(jù)摘要算法,并且這種密鑰使用的是公鑰和私鑰,是數(shù)據(jù)摘要和非對(duì)稱加密的結(jié)合體。類似手寫(xiě)簽名,主要是用來(lái)驗(yàn)證數(shù)據(jù)完整性和認(rèn)證數(shù)據(jù)來(lái)源。
其校驗(yàn)和認(rèn)證流程分為以下幾步:?
1. 消息發(fā)送方公布自己的公鑰?
2. 消息發(fā)送方利用自己的私鑰對(duì)數(shù)據(jù)簽名得到簽名值,并將數(shù)據(jù)和簽名值一起發(fā)送給接收方?
3. 接收方利用發(fā)送方的公鑰對(duì)數(shù)據(jù)和簽名值進(jìn)行驗(yàn)簽
?
?
可見(jiàn)與上述消息認(rèn)證碼校驗(yàn)流程非常相似,并且可以知道簽名時(shí)是私鑰加密,公鑰解密,與之前加密數(shù)據(jù)(交換密鑰)時(shí)相反,那里是公鑰加密,私鑰解密
簽名算法分類
主要包括RSA,DSA和ECDSA共三種算法
數(shù)字證書(shū)
回顧前面瀏覽器與銀行通過(guò)非對(duì)稱加密算法進(jìn)行交互通信密鑰的流程圖
?
要解決這個(gè)問(wèn)題用到數(shù)字證書(shū)
數(shù)字證書(shū)是什么
數(shù)字證書(shū)類似我們的身份證,用于標(biāo)識(shí)通信方的身份,其本身就是一個(gè)格式規(guī)范的文件,如下圖所示
?
其中最重要的信息有簽發(fā)機(jī)構(gòu),簽發(fā)機(jī)構(gòu)簽名,證書(shū)的持有者名稱,證書(shū)持有者的公鑰
證書(shū)每個(gè)人都可以制作,但需要到權(quán)威機(jī)構(gòu)作認(rèn)證,否則沒(méi)有可信性。
有了證書(shū),就不用擔(dān)心假冒銀行網(wǎng)站了,仍以前面例子為例,瀏覽器向銀行請(qǐng)求公鑰,其實(shí)應(yīng)該是請(qǐng)求銀行的證書(shū)(證書(shū)里有公鑰),假設(shè)瀏覽器請(qǐng)求被劫持到一個(gè)假冒銀行,瀏覽器收到假冒銀行自己的制作的證書(shū),瀏覽器發(fā)現(xiàn)這個(gè)沒(méi)有被權(quán)威機(jī)構(gòu)認(rèn)證,不可信,就會(huì)中斷通信,所以沒(méi)安全問(wèn)題。再假如假冒銀行拿到真招行的數(shù)字證書(shū)返回給瀏覽器(這個(gè)可以拿到,證書(shū)是公開(kāi)的,想拿都可以拿),瀏覽器通過(guò)驗(yàn)證,發(fā)現(xiàn)證書(shū)是真的,就用證書(shū)上的真招行的公鑰加密通過(guò)密鑰key返回給假冒銀行,這時(shí)也沒(méi)有問(wèn)題,因?yàn)檫@個(gè)key是用真招行的公鑰加密的,需要用真招行的私鑰來(lái)解密,而假銀行沒(méi)有招行的私鑰,無(wú)法解密,他得不到真實(shí)的通信密鑰key,這也是安全的,密鑰沒(méi)有泄露。
前面一直說(shuō)瀏覽器可以判斷一個(gè)證書(shū)是經(jīng)過(guò)權(quán)威機(jī)構(gòu)認(rèn)證了的還是自己制作的不可靠的證書(shū),這是如何做到的呢?見(jiàn)下圖
?
瀏覽器已經(jīng)內(nèi)置了這些權(quán)威證書(shū)認(rèn)證機(jī)構(gòu)的公鑰,所以可以利用這些公鑰來(lái)判斷證書(shū)是不是那個(gè)權(quán)威機(jī)構(gòu)認(rèn)證過(guò)的。
簽名證書(shū)VS加密證書(shū)
博客分類:?
? PKI
數(shù)字證書(shū)?
從證書(shū)的用途來(lái)看,數(shù)字證書(shū)可以分為:
?簽名證書(shū):主要用于對(duì)用戶信息進(jìn)行簽名,以保證信息的不可否認(rèn)性。
?加密證書(shū):主要用于對(duì)用戶傳送信息進(jìn)行加密,以保證信息的真實(shí)性和完整性。
?
什么是加密證書(shū)和簽名證書(shū)??
? ? ? ?
? ? 數(shù)字證書(shū)可分為簽名證書(shū)和加密證書(shū)。
? ? 簽名證書(shū)主要用于對(duì)用戶信息進(jìn)行簽名,以保證信息的有效性和不可否認(rèn)性;
? ? 加密證書(shū)主要用于對(duì)用戶傳送信息進(jìn)行加密,以保證信息的保密性和完整性。
? ? 每個(gè)證書(shū)都包含一對(duì)密鑰即簽名公鑰和簽名私鑰,加密公鑰和加密私鑰,將簽名證書(shū)和加密證書(shū)的公鑰公布于外。
? ? 簽名時(shí),用簽名證書(shū)的私鑰進(jìn)行簽名,其他用戶可以利用公布于外網(wǎng)的簽名公鑰對(duì)簽名進(jìn)行驗(yàn)證。
? ? 加密時(shí),用戶B利用用戶A公布于外網(wǎng)的加密公鑰對(duì)信息進(jìn)行加密傳送給用戶A,用戶A利用自己的加密私鑰對(duì)加密后的信
? ? 息進(jìn)行解密得到完整的明文信息。
?
=================================================================
?
數(shù)字證書(shū)格式-摘要
?版本 :該證書(shū)使用的是哪種版本的X.509標(biāo)準(zhǔn)
?序列號(hào):本項(xiàng)是CA分配給每一個(gè)證書(shū)的唯一的數(shù)字型編號(hào),證書(shū)序列號(hào)的長(zhǎng)度在不同的
? CA系統(tǒng)中是可配置的。
?簽名算法:本項(xiàng)用來(lái)指定頒發(fā)機(jī)構(gòu)CA簽發(fā)證書(shū)時(shí)使用的簽名算法
?頒發(fā)者:issuer 本項(xiàng)標(biāo)識(shí)了頒發(fā)該證書(shū)的機(jī)構(gòu)DN
?有效期:validity 本項(xiàng)是證書(shū)的有效期和終止日期
?主題:subject 證書(shū)擁有者的唯一是別名,這個(gè)字段必須是非空的。
? ? ?有效的DN(Distinct Name)標(biāo)識(shí):
? ? ? ?c ? ? ? ? ?country code (一般是c=cn)
? ? ? ?o ? ? ? ? ?organization(組織)
? ? ? ?ou ? ? ? ?organizational unit name(組織單位名)
? ? ? ?cn ? ? ? ?common name (普通名)
? ? ? ?e ? ? ? ? ?email (郵件地址)
? ? ? ?l ? ? ? ? ? locality name (地址)
? ? ? ?st ? ? ? ? state, or province name (國(guó)家或省份名)
? ? ? ?dc ? ? ? ?domain Component (領(lǐng)域)
? ? ? ?uid ? ? ?user id (用戶標(biāo)識(shí)符)
? ? ? ?t ? ? ? ? ?title (標(biāo)題)
? ? ? ?sn ? ? ? ?device serial number name
?公鑰 public key: 本項(xiàng)用來(lái)標(biāo)識(shí)公鑰,公鑰算法和公鑰長(zhǎng)度。
?微縮圖算法:和證書(shū)本身沒(méi)多大關(guān)系,就是哈希算法,通常用MD5或SHA1.
?微縮圖:是指對(duì)整個(gè)證書(shū)進(jìn)行hash運(yùn)算之后生成的一段數(shù)據(jù),就是對(duì)證書(shū)的哈希摘要。
android要求所有的程序必須有簽名,否則就不會(huì)安裝該程序。在我們開(kāi)發(fā)過(guò)程中,adt使用debug keystore,在 preference->android->buid中設(shè)置。debug的keystore默認(rèn)有效期為一年,如果你是從一年前開(kāi)始開(kāi)發(fā) android程序,那么很可能出現(xiàn)debug keystore過(guò)期,導(dǎo)致你無(wú)法生成 apk文件。我調(diào)了一下系統(tǒng)時(shí)間,就出現(xiàn)以下錯(cuò)誤。此時(shí)你只要?jiǎng)h除debug keystore就行,系統(tǒng)又會(huì)為你生成有效期為一年的私鑰。
當(dāng)debug keystore過(guò)期,會(huì)出現(xiàn)如下的錯(cuò)誤:
Error generating final archive: Debug Certificate expired on…
debug keystore刪除方法:
進(jìn)入C:\Documents and Settings\Administrator\.android 刪除路徑下的debug.keystore及 ddms.cfg。
(不同環(huán)境下的目錄可能略有不同,可在eclipse中查找此路徑:Window->Preferences->Android->Build下 Default debug keystore)
然后重新導(dǎo)入即可。
ubuntu環(huán)境下的解決辦法: ?rm -rf ?~/.android/debug.keystore?
當(dāng)你release時(shí),你可以用 右擊項(xiàng)目->android tools->export signed android package生成簽名的包。再此過(guò)程中,如果你還沒(méi)有你自己的私鑰,adt會(huì)自動(dòng)調(diào)用 keytool 來(lái)為你生成。請(qǐng)保護(hù)好你的私鑰,否則被人盜用的話,就用攻擊你的簽名程序了。
release前還應(yīng)注意版本號(hào),在manifest.xml中有兩個(gè)字段android:versionCode="1"和 android:versionName="1.0",其中前者是給程序或者android使用,以1遞增。后者是給用戶看的,在這里你就可以使用主版本 號(hào) 次版本號(hào) build號(hào)等字符串。
---------------------------------------
keystore的生成:
cmd下:
進(jìn)入到j(luò)dk的bin目錄,這樣的話,android.keystore文件就會(huì)生成在這個(gè)目錄下,簽名的時(shí)候我們需要這個(gè)文件
D:\Program Files\Java\jdk1.6.0_20\bin>keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什么?
? [Unknown]: ?qiaoling您的組織單位名稱是什么?
? [Unknown]: ?www.chinaandroid.com
您的組織名稱是什么?
? [Unknown]: ?www.chinaandroid.com
您所在的城市或區(qū)域名稱是什么?
? [Unknown]: ?haidian
您所在的州或省份名稱是什么?
? [Unknown]: ?BJ
該單位的兩字母國(guó)家代碼是什么
? [Unknown]: ?86
CN=qiaoling, OU=www.chinaandroid.com, O=www.chinaandroid.com, L=haidian, ST=BJ, C=86 正確嗎?
? [否]: ?Y
輸入<android.keystore>的主密碼(如果和 keystore 密碼相同,按回車):
其中參數(shù)-validity為證書(shū)有效天數(shù),這里我們寫(xiě)的大些10000天。還有在輸入密碼時(shí)沒(méi)有回顯(盡管輸就是啦) 并且 退格,tab等都屬于密碼內(nèi)容,這個(gè)密碼在給.apk文件簽名的時(shí)候需要.
?
然后簽名:
Eclipse中,右擊需要簽名的工程-->android tools-->export signed application package...
出現(xiàn)下面對(duì)話框,選擇需要簽名的工程
next,選擇上面生成的android.keystore文件位置和設(shè)置的密碼
next
next,選擇簽名生成文件的位置和名稱
keykeytool錯(cuò)誤: java.io.FileNotFoundException: android.key (Permission denied)
tool 在JDK的/bin目錄下,比如:/opt/jdk/bin
用以下的命令生成一個(gè)證書(shū):
keytool -genkey -alias android.key -keyalg RSA -validity 20000 -keystore android.key
老是報(bào)如題的錯(cuò)誤:
后來(lái)才知道是因?yàn)楫?dāng)前的目錄下沒(méi)有寫(xiě)的權(quán)限,所以需要指定一個(gè)路徑來(lái)存放android.key:
keytool -genkey -alias android.key -keyalg RSA -validity 20000 -keystore /<MY_PATH>/android.key
注: 該單位的兩字母國(guó)家代碼是什么(中國(guó)是 CN)
打包的時(shí)候如果出現(xiàn): jarsigner: 找不到 android.key 的證書(shū)鏈。android.key 必須引用包含專用密鑰和相應(yīng)的公共密鑰證書(shū)鏈的有效密鑰庫(kù)密鑰條目。
那么可能是 -alias 部分多了路徑名導(dǎo)致與其后面的keystore不同名。
查看證書(shū)信息:
keytool -list -v -keystore android.key -storepass <PSW>
keystore信息的查看
本文系轉(zhuǎn)載,原文地址:http://dev.10086.cn/cmdn/bbs/thread-58334-1-1.html
?
keystore信息的查看:
keytool -list -v -keystore e:\keytool\yushan.keystore -storepass 123456
顯示內(nèi)容:
---------------------------------------------------------------------
Keystore 類型: JKS
Keystore 提供者: SUN
您的 keystore 包含 1 輸入
別名名稱: yushan
創(chuàng)建日期: 2009-7-29
項(xiàng)類型: PrivateKeyEntry
認(rèn)證鏈長(zhǎng)度: 1
認(rèn)證 [1]:
所有者:CN=yushan, OU=xx公司, O=xx協(xié)會(huì), L=湘潭, ST=湖南, C=中國(guó)
簽發(fā)人:CN=yushan, OU=xx公司, O=xx協(xié)會(huì), L=湘潭, ST=湖南, C=中國(guó)
序列號(hào):4a6f29ed
有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010
證書(shū)指紋:
MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3
SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8
簽名算法名稱:SHA1withRSA
版本: 3
--------------------------------------------------------------------
缺省情況下,-list 命令打印證書(shū)的 MD5 指紋。而如果指定了 -v 選項(xiàng),將以可讀格式打印證書(shū),如果指定了 -rfc 選項(xiàng),將以可打印的編碼格式輸出證書(shū)。
keytool -list -rfc -keystore e:\yushan.keystore -storepass 123456
顯示:
-------------------------------------------------------------------------------------------------------
Keystore 類型: JKS
Keystore 提供者: SUN
您的 keystore 包含 1 輸入
別名名稱: yushan
創(chuàng)建日期: 2009-7-29
項(xiàng)類型: PrivateKeyEntry
認(rèn)證鏈長(zhǎng)度: 1
認(rèn)證 [1]:
-----BEGIN CERTIFICATE-----
MIICSzCCAbSgAwIBAgIESm8p7TANBgkqhkiG9w0BAQUFADBqMQ8wDQYDVQQGDAbkuK3lm70xDzAN
BgNVBAgMBua5luWNlzEPMA0GA1UEBwwG5rmY5r2tMREwDwYDVQQKDAh4eOWNj+S8mjERMA8GA1UE
CwwIeHjlhazlj7gxDzANBgNVBAMTBnl1c2hhbjAeFw0wOTA3MjgxNjQwMTNaFw0xMDA3MjgxNjQw
MTNaMGoxDzANBgNVBAYMBuS4reWbvTEPMA0GA1UECAwG5rmW5Y2XMQ8wDQYDVQQHDAbmuZjmva0x
ETAPBgNVBAoMCHh45Y2P5LyaMREwDwYDVQQLDAh4eOWFrOWPuDEPMA0GA1UEAxMGeXVzaGFuMIGf
MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJoru1RQczRzTnBWxefVNspQBykS220rS8Y/oX3mZa
hjL4wLfOURzUuxxuVQR2jx7QI+XKME+DHQj9r6aAcLBCi/T1jwF8mVYxtpRuTzE/6KEZdhowEe70
liWLVE+hytLBHZ03Zhwcd6q5HUMu27du3MPQvqiwzTY7MrwIvQQ8iQIDAQABMA0GCSqGSIb3DQEB
BQUAA4GBAGoQQ1/FnTfkpQh+Ni6h3fZdn3sR8ZzDMbOAIYVLAhBb85XDJ8QZTarHbZMJcIdHxAl1
i08ct3E8U87V9t8GZFWVC4BFg/+zeFEv76SFpVE56iX7P1jpsu78z0m69hHlds77VJTdyfMSvtXv
sYHP3fxfzx9WyhipBwd8VPK/NgEP
-----END CERTIFICATE-----
2、查看md5指紋驗(yàn)證
輸入keytool -list -v -alias ?android.keystore -keystore 再加上所要查看的keystore所在的路徑
如: keytool -list -v -alias androiddebugkey -keystore d:\android.keystore,回車
-alias android.keystore 這個(gè)是別名
-keystore d:\android.keystore 具體位置的密鑰庫(kù)
要求輸入密碼,密碼是android,至此就可以拿到MD5認(rèn)證指紋了
keytool -genkeypair -keystore zrong2.p12 -storetype pkcs12 -validity 8050
keytool -list -keystore zrong2.p12 -storetype pkcs12 -v
二、使用p12證書(shū)為apk簽名
將 p12 文件轉(zhuǎn)成jks或者keystore文件就可以在ADT中使用了。
先創(chuàng)建一個(gè)空的 jks文件
1. keytool -genkey -alias anyname -keystore yourcertificate.jks
2. keytool -genkey -alias anyname -keystore yourcertificate.keystore
導(dǎo)入p12證書(shū)
1. keytool -importkeystore -srckeystore yourcertificate.p12 -srcstoretype PKCS12 -destkeystore yourcertificate.jks -deststoretype JKS
2. keytool -importkeystore -srckeystore yourcertificate.p12 -srcstoretype PKCS12 -destkeystore yourcertificate.keystore -deststoretype JKS
現(xiàn)在可以使用這個(gè)JKS文件了。
總結(jié)
- 上一篇: arial unicode ms字体_(
- 下一篇: “约见”面试官系列之常见面试题之第七十二