五、數(shù)字簽名和數(shù)字證書
1、數(shù)字簽名
5.1.1概述
數(shù)字簽名的作用在于用來鑒別接受方接受到的信息是否是發(fā)送方發(fā)送過來的,并且中間是否又被篡改過。
關(guān)于四中的流程,我們假定這樣一種情況,
客戶端使用公鑰對文件進行加密,然后向服務(wù)器傳輸密文,但是傳輸?shù)倪^程中,被同樣有公鑰的黑客截獲(公鑰任何人都可以擁有),這個時候黑客利用自己的公鑰,重新加密一封密文,傳輸給服務(wù)器。如此一來,服務(wù)器收到的密文不是客戶端傳過來的,而是黑客傳過來的。但是服務(wù)器并不知道。如此一來,就產(chǎn)生了文件被掉包。
數(shù)字簽名的作用就是用來校驗文件是否在傳輸過程中是否被篡改和掉包。具體實現(xiàn)方式有兩種:無保密機制簽名和保密機制簽名
5.1.2無保密機制簽名
客戶端在對明文加密之前,先使用摘要算法,對明文生成摘要,然后把摘要使用非對稱加密的方式進行加密,然后傳輸給服務(wù)器,服務(wù)器收到摘要密文后使用私鑰進行解密,然后把收到的文件明文進行摘要算法,得到摘要后和客戶端傳輸過來的密文進行比對。就可以知道,文件是否被替換。

最常用的摘要算法叫做MD5(Message Digest 5),它的作者R.L.
5.1.3保密機制簽名
上面的加密方式中,只是實現(xiàn)了使用簽名如何對校驗傳輸數(shù)據(jù)是否被篡改和替換,但是傳輸?shù)倪€是明文,如果要想對傳輸明文進行加密成密文,是否也要使用RSA加密算法呢?
這種做法很不可取,因為RSA加密算法效率很低,所需加密的明文越長,效率會呈指數(shù)下降。那么應(yīng)該怎么辦呢?
方法就是:
使用對稱加密的方式對明文加密,然后將對稱加密的秘鑰使用RSA加密,然后在對密文生成摘要,然后傳輸。
具體加密步驟為:
(1)發(fā)送方選擇一個對稱加密算法(比如DES)和一個對稱密鑰對報文進行加密;
(2)發(fā)送方用接收方的公鑰和RSA算法對第1步中的對稱密鑰進行加密,并且將加密后的對稱密鑰附加在密文中;
(3)發(fā)送方使用一個摘要算法從第2步的密文中得到報文摘要,然后用RSA算法和發(fā)送方的私鑰對此報文摘要進行加密,這就是發(fā)送方的數(shù)字簽名;
(4)將第3步得到的數(shù)字簽名封裝在第2步的密文后,并通過網(wǎng)絡(luò)發(fā)送給接收方;
(5)接收方使用RSA算法和發(fā)送方的公鑰對收到的數(shù)字簽名進行解密,得到一個報文摘要;
(6)接收方使用相同的摘要算法,從接收到的報文密文中計算出一個報文摘要;
(7)如果第5步和第6步的報文摘要是相同的,就可以確認密文沒有被篡改,并且是由指定的發(fā)送方簽名發(fā)送的;
(8)接收方使用RSA算法和接收方的私鑰解密出對稱密鑰;
(9)接收方使用對稱加密算法(比如DES)和對稱密鑰對密文解密,得到原始報文。
2、數(shù)字證書
5.2.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)上用它來識別對方的身份。
5.2.2. 應(yīng)用場景
- 交易者身份的確定性、不可否認性、不可修改性
- 對應(yīng)用進行簽名認證(例如Android 的apk)
5.2.3. 數(shù)字證書格式

數(shù)字證書的格式普遍采用的是X.509V3 國際標準,一個標準的X.509 數(shù)字證書包含以下一些內(nèi)容:
- 證書的版本信息
- 證書的序列號,每個證書都有一個唯一的證書序列號
- 證書所使用的簽名算法
- 證書的發(fā)行機構(gòu)名稱,命名規(guī)則一般采用X.500 格式
- 證書的有效期,通用的證書一般采用UTC 時間格式,它的計時范圍為1950-2049
- 證書所有人的名稱,命名規(guī)則一般采用X.500 格式
- 證書所有人的公開密鑰
- 證書發(fā)行者對證書的簽名
5.2.4. 數(shù)字證書原理

數(shù)字證書是安全領(lǐng)域里的終極武器,SSL 通信協(xié)議里最核心的東西就是數(shù)字證書。他涉及到前面提到的所有知識:對稱加密、非對稱加密、消息摘要、數(shù)字簽名等。
數(shù)字證書可以通過java 自帶的KeyTool 工具生成,生成后的數(shù)字證書一般保管在KeyStore 里。KeyStore可以叫做秘鑰倉庫。
秘鑰倉庫可以保管3 種類型的數(shù)據(jù):KeyStore.PrivateKeyEntry(非對稱機密里的私鑰)、KeyStore.SecretKeyEntry (對稱加密里的秘鑰)、KeyStore.TrustedCertificateEntry(受信任的證書)
5.2.5.補充
- 簽名證書
由權(quán)威頒發(fā)機構(gòu)頒發(fā)給服務(wù)器或者個人用于證明自己身份的東西,默認客戶端都是信任的。主要目的是用來加密和保證數(shù)據(jù)的完整性和不可抵賴性
例如根證書機構(gòu)Symantec 頒發(fā)給百度的就是簽名證書,是受信任的。

- 自簽名證書
由服務(wù)器自己頒發(fā)給自己,用于證明自己身份的東西,非權(quán)威頒發(fā)機構(gòu)發(fā)布,默認客戶端都是不信任的,主要目的是用來加密和保證數(shù)據(jù)的完整性和不可抵賴性,與簽名證書相同.
例如中鐵集團(SRCA)辦法給12306 的證書就是自簽名證書,自己給自己頒發(fā)的。

六、其他問題
關(guān)于 四 中的流程還有一些潛在的小問題。
【問題1】
上面的通信過程中說到,在檢查完證書后,“客戶”發(fā)送一個隨機的字符串給“服務(wù)器”去用私鑰加密,以便判斷對方是否真的持有私鑰。但是有一個問題,“黑客”也可以發(fā)送一個字符串給“服務(wù)器”去加密并且得到加密后的內(nèi)容,這樣對于“服務(wù)器”來說是不安全的,因為黑客可以發(fā)送一些簡單的有規(guī)律的字符串給“服務(wù)器”加密,從而尋找加密的規(guī)律,有可能威脅到私鑰的安全。所以說,“服務(wù)器”隨隨便便用私鑰去加密一個來路不明的字符串并把結(jié)果發(fā)送給對方是不安全的。
〖解決方法〗
每次收到“客戶”發(fā)來的要加密的的字符串時,“服務(wù)器”并不是真正的加密這個字符串本身,而是把這個字符串進行一個hash計算,加密這個字符串的hash值(不加密原來的字符串)后發(fā)送給“客戶”,“客戶”收到后解密這個hash值并自己計算字符串的hash值然后進行對比是否一致。也就是說,“服務(wù)器”不直接加密收到的字符串,而是加密這個字符串的一個hash值,這樣就避免了加密那些有規(guī)律的字符串,從而降低被破解的機率。“客戶”自己發(fā)送的字符串,因此它自己可以計算字符串的hash值,然后再把“服務(wù)器”發(fā)送過來的加密的hash值和自己計算的進行對比,同樣也能確定對方是否是“服務(wù)器”。
【問題2】
在雙方的通信過程中,“黑客”可以截獲發(fā)送的加密了的內(nèi)容,雖然他無法解密這個內(nèi)容,但是他可以搗亂,例如把信息原封不動的發(fā)送多次,擾亂通信過程。
〖解決方法〗
可以給通信的內(nèi)容加上一個序號或者一個隨機的值,如果“客戶”或者“服務(wù)器”接收到的信息中有之前出現(xiàn)過的序號或者隨機值,那么說明有人在通信過程中重發(fā)信息內(nèi)容進行搗亂,雙方會立刻停止通信。
【問題3】
在雙方的通信過程中,“黑客”除了簡單的重復發(fā)送截獲的消息之外,還可以修改截獲后的密文修改后再發(fā)送,因為修改的是密文,雖然不能完全控制消息解密后的內(nèi)容,但是仍然會破壞解密后的密文。因此發(fā)送過程如果黑客對密文進行了修改,“客戶”和“服務(wù)器”是無法判斷密文是否被修改的。
〖解決方法〗
在每次發(fā)送信息時,先對信息的內(nèi)容進行一個hash計算得出一個hash值,將信息的內(nèi)容和這個hash值一起加密后發(fā)送。接收方在收到后進行解密得到明文的內(nèi)容和hash值,然后接收方再自己對收到信息內(nèi)容做一次hash計算,與收到的hash值進行對比看是否匹配,如果匹配就說明信息在傳輸過程中沒有被修改過。如果不匹配說明中途有人故意對加密數(shù)據(jù)進行了修改,立刻中斷通話過程后做其它處理。