Android 安全加密:數(shù)字簽名和數(shù)字證書詳解
Android安全加密專題文章索引
以上學習所有內(nèi)容,對稱加密、非對稱加密、消息摘要、數(shù)字簽名等知識都是為了理解數(shù)字證書工作原理而作為一個預備知識。數(shù)字證書是密碼學里的終極武器,是人類幾千年歷史總結(jié)的智慧的結(jié)晶,只有在明白了數(shù)字證書工作原理后,才能理解Https 協(xié)議的安全通訊機制。最終才能在SSL 開發(fā)過程中得心應手。
另外,對稱加密和消息摘要這兩個知識點是可以單獨拿來使用的。
知識點串聯(lián):
數(shù)字證書使用到了以上學習的所有知識
- 對稱加密與非對稱加密結(jié)合使用實現(xiàn)了秘鑰交換,之后通信雙方使用該秘鑰進行對稱加密通信。
- 消息摘要與非對稱加密實現(xiàn)了數(shù)字簽名,根證書機構(gòu)對目標證書進行簽名,在校驗的時候,根證書用公鑰對其進行校驗。若校驗成功,則說明該證書是受信任的。
- Keytool 工具可以創(chuàng)建證書,之后交給根證書機構(gòu)認證后直接使用自簽名證書,還可以輸出證書的RFC格式信息等。
- 數(shù)字簽名技術(shù)實現(xiàn)了身份認證與數(shù)據(jù)完整性保證。
- 加密技術(shù)保證了數(shù)據(jù)的保密性,消息摘要算法保證了數(shù)據(jù)的完整性,對稱加密的高效保證了數(shù)據(jù)處理的可靠性,數(shù)字簽名技術(shù)保證了操作的不可否認性。
通過以上內(nèi)容的學習,我們要能掌握以下知識點:
- 基礎知識:bit 位、字節(jié)、字符、字符編碼、進制轉(zhuǎn)換、io
- 知道怎樣在實際開發(fā)里怎樣使用對稱加密解決問題
- 知道對稱加密、非對稱加密、消息摘要、數(shù)字簽名、數(shù)字證書是為了解決什么問題而出現(xiàn)的
- 了解SSL 通訊流程
- 實際開發(fā)里怎樣請求Https 的接口
數(shù)字簽名
1. 概述
數(shù)字簽名是非對稱加密與數(shù)字摘要的組合應用
2. 應用場景
校驗用戶身份(使用私鑰簽名,公鑰校驗,只要用公鑰能校驗通過,則該信息一定是私鑰持有者發(fā)布的)
校驗數(shù)據(jù)的完整性(用解密后的消息摘要跟原文的消息摘要進行對比)
3. 簽名過程
“發(fā)送報文時,發(fā)送方用一個哈希函數(shù)從報文文本中生成報文摘要,然后用自己的私人密鑰對這個摘要進行加密,這個加密后的摘要將作為報文的數(shù)字簽名和報文一起發(fā)送給接收方,接收方首先用與發(fā)送方一樣的哈希函數(shù)從接收到的原始報文中計算出報文摘要,接著再用發(fā)送方的公用密鑰來對報文附加的數(shù)字簽名進行解密,如果這兩個摘要相同、那么接收方就能確認該數(shù)字簽名是發(fā)送方的。
數(shù)字簽名有兩種功效:一是能確定消息確實是由發(fā)送方簽名并發(fā)出來的,因為別人假冒不了發(fā)送方的簽名。二是數(shù)字簽名能確定消息的完整性。因為數(shù)字簽名的特點是它代表了文件的特征,文件如果發(fā)生改變,數(shù)字摘要的值也將發(fā)生變化。不同的文件將得到不同的數(shù)字摘要。一次數(shù)字簽名涉及到一個哈希函數(shù)、發(fā)送者的公鑰、發(fā)送者的私鑰?!?/p>
4. 使用步驟
//獲取signature 對象,初始化算法:MD2withRSA, MD5withRSA, or SHA1withRSA Signature signature = Signature.getInstance("MD5withRSA"); //創(chuàng)建私鑰(從磁盤上讀取) PrivateKey privateKey = (PrivateKey)SerializableUtil.readObject( "heima.privateKey"); //使用私鑰進行初始化 signature.initSign(privateKey); //傳入需要簽名的數(shù)據(jù) signature.update(content.getBytes()); //執(zhí)行簽名 byte[] sign = signature.sign(); //創(chuàng)建公鑰(從磁盤上讀?。? PublicKey publicKey = (PublicKey) SerializableUtil.readObject( "heima.publicKey"); //使用公鑰進行初始化 signature.initVerify(publicKey); //傳入需要校驗的數(shù)據(jù)(即上面的原文) signature.update(content.getBytes()); //執(zhí)行校驗 boolean verify = signature.verify(sign);
5. 總結(jié)
數(shù)字簽名一般不單獨使用,基本都是用在數(shù)字證書里實現(xiàn)SSL 通信協(xié)議。下面將學習的數(shù)字證書就是基于數(shù)字簽名技術(shù)實現(xiàn)的。
數(shù)字證書
1. 概述
數(shù)字證書就是互聯(lián)網(wǎng)通訊中標志通訊各方身份信息的一串數(shù)字,提供了一種在Internet 上驗證通信實體身份的方式,數(shù)字證書不是數(shù)字身份證,而是身份認證機構(gòu)蓋在數(shù)字身份證上的一個章或?。ɑ蛘哒f加在數(shù)字身份證上的一個簽名)。它是由權(quán)威機構(gòu)——CA 機構(gòu),又稱為證書授權(quán)(Certificate Authority)中心發(fā)行的,人們可以在網(wǎng)上用它來識別對方的身份。
2. 應用場景
交易者身份的確定性、不可否認性、不可修改性
對應用進行簽名認證(例如Android 的apk)
3. 數(shù)字證書格式
數(shù)字證書的格式普遍采用的是X.509V3 國際標準,一個標準的X.509 數(shù)字證書包含以下一些內(nèi)容:
- 證書的版本信息;
- 證書的序列號,每個證書都有一個唯一的證書序列號;
- 證書所使用的簽名算法;
- 證書的發(fā)行機構(gòu)名稱,命名規(guī)則一般采用X.500 格式;
- 證書的有效期,通用的證書一般采用UTC 時間格式,它的計時范圍為1950-2049;
- 證書所有人的名稱,命名規(guī)則一般采用X.500 格式;
- 證書所有人的公開密鑰;
- 證書發(fā)行者對證書的簽名。
4. 數(shù)字證書原理
數(shù)字證書是安全領域里的終極武器,SSL 通信協(xié)議里最核心的東西就是數(shù)字證書。他涉及到前面提到的所有知識:對稱加密、非對稱加密、消息摘要、數(shù)字簽名等。
數(shù)字證書可以通過java 自帶的KeyTool 工具生成,生成后的數(shù)字證書一般保管在KeyStore 里。KeyStore可以叫做秘鑰倉庫。
秘鑰倉庫可以保管3 種類型的數(shù)據(jù):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
顯示數(shù)字證書文件中的證書信息:
keytool -printcert -file lisi.cer
直接雙擊lisi.cer,用window 系統(tǒng)的內(nèi)置程序打開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. 補充
簽名證書:
由權(quán)威頒發(fā)機構(gòu)頒發(fā)給服務器或者個人用于證明自己身份的東西,默認客戶端都是信任的。主要目的是用來加密和保證數(shù)據(jù)的完整性和不可抵賴性
例如根證書機構(gòu)Symantec 頒發(fā)給百度的就是簽名證書,是受信任的。
自簽名證書:
由服務器自己頒發(fā)給自己,用于證明自己身份的東西,非權(quán)威頒發(fā)機構(gòu)發(fā)布,默認客戶端都是不信任的,主要目的是用來加密和保證數(shù)據(jù)的完整性和不可抵賴性,與簽名證書相同.
例如中鐵集團(SRCA)辦法給12306 的證書就是自簽名證書,自己給自己頒發(fā)的。
相關文章
Android WebView與JS交互全面詳解(小結(jié))
本篇文章主要介紹了Android WebView與JS交互全面詳解(小結(jié)),實現(xiàn)了Android客戶端與Web網(wǎng)頁交互,具有一定的參考價值,有興趣的可以了解一下2017-11-11Android開發(fā)實現(xiàn)的Intent跳轉(zhuǎn)工具類實例
這篇文章主要介紹了Android開發(fā)實現(xiàn)的Intent跳轉(zhuǎn)工具類,簡單描述了Intent組件的功能并結(jié)合實例形式給出了頁面跳轉(zhuǎn)、拍照、圖片調(diào)用等相關操作技巧,需要的朋友可以參考下2017-11-11android自定義按鈕示例(重寫imagebutton控件實現(xiàn)圖片按鈕)
由于項目這種類型的圖片按鈕比較多,所以重寫了ImageButton類,現(xiàn)在把代碼分享給大家,需要的朋友可以參考下2014-03-03Android編程實現(xiàn)activity dialog透明背景的方法
這篇文章主要介紹了Android編程實現(xiàn)activity dialog透明背景的方法,涉及Activity相關屬性設置及配置文件操作技巧,需要的朋友可以參考下2017-07-07