一個故事教你看懂什麼是數字證書,它的原理是什麼?它的作用是什麼?
阿新 • • 發佈:2018-11-13
原創地址:http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
1、基礎知識
這部分內容主要解釋一些概念和術語,最好是先理解這部分內容。
1.1、公鑰密碼體制(public-key cryptography)
公鑰密碼體制分為三個部分,
公鑰
、
私鑰
、加密解密演算法,它的加密解密過程如下:
在
對稱加密演算法
中,加密使用的
金鑰
和解密使用的
金鑰
是相同的。也就是說,加密和解密都是使用的同一個
金鑰
。因此對稱加密演算法要保證安全性的話,
金鑰
要做好保密,只能讓使用的人知道,不能對外公開。這個和上面的
公鑰密碼體制
有所不同,公鑰密碼體制中加密是用
公鑰
,解密使用
私鑰
,而對稱加密演算法中,加密和解密都是使用同一個
金鑰
,不區分
公鑰
和
私鑰
。
//
金鑰
,一般就是一個字串或數字,在加密或者解密時傳遞給加密/解密演算法。前面在
公鑰密碼體制
中說到的
公鑰
、
私鑰
就是
金鑰
,
公鑰
是加密使用的
金鑰
,
私鑰
是解密使用的
金鑰
。
1.3、非對稱加密演算法(asymmetric key algorithms)
在
非對稱加密演算法
中,加密使用的
金鑰
和解密使用的
金鑰
是不相同的。前面所說的
公鑰密碼體制
就是一種非對稱加密演算法,他的
公鑰
和是
私鑰
是不能相同的,也就是說加密使用的
金鑰
和解密使用的
金鑰
不同,因此它是一個
非對稱加密演算法
。
1.4、RSA簡介
RSA是一種公鑰密碼體制,現在使用得很廣泛。如果對RSA本身有興趣的,後面看我有沒有時間寫個RSA的具體介紹。
RSA密碼體制是一種公鑰密碼體制,
公鑰
公開,
私鑰
保密,它的加密解密演算法是公開的。 由
公鑰
加密的內容可以並且只能由
私鑰
進行解密,並且由
私鑰
加密的內容可以並且只能由公鑰進行
解密
。也就是說,
RSA的這一對公鑰、私鑰都可以用來加密和解密,並且一方加密的內容可以由並且只能由對方進行解密
。
1.5、簽名和加密
我們說
加密
,是指對某個內容
加密
,
加密
後的內容還可以通過
解密
進行還原。 比如我們把一封郵件進行加密,
加密
後的內容在網路上進行傳輸,接收者在收到後,通過
解密
可以還原郵件的真實內容。
這裡主要解釋一下
簽名
,
簽名
就是在
資訊
的後面再加上一段內容,可以證明
資訊
沒有被修改過,怎麼樣可以達到這個效果呢?一般是對
資訊
做一個hash計算得到一個hash值,注意,這個過程是
不可逆
的,也就是說無法通過hash值得出原來的
資訊
內容。在把
資訊
傳送出去時,把這個hash值加密後做為一個
簽名
和
資訊
一起發出去。 接收方在收到
資訊
後,會重新計算
資訊
的hash值,並和
資訊
所附帶的hash值(解密後)進行對比,如果一致,就說明資訊的內容沒有被修改過,
因為這裡hash計算可以保證不同的內容一定會得到不同的hash值
,所以只要內容一被修改,根據
資訊
內容計算的hash值就會變化。當然,不懷好意的人也可以修改
資訊
內容的同時也修改hash值,從而讓它們可以相匹配,為了防止這種情況,hash值一般都會加密後(也就是
簽名
)再和
資訊
一起傳送,以保證這個hash值不被修改。至於如何讓別人可以解密這個
簽名
,這個過程涉及到
數字證書
等概念,我們後面在說到
數字證書
時再詳細說明,這裡您先只需先理解
簽名
的這個概念。
2、一個加密通訊過程的演化
我們來看一個例子,現在假設“伺服器”和“客戶”要在網路上通訊,並且他們打算使用RSA(參看前面的RSA簡介)來對通訊進行加密以保證談話內容的安全。由於是使用RSA這種
公鑰
密碼體制,“伺服器”需要對外發布
公鑰
(演算法不需要公佈,RSA的演算法大家都知道),自己留著
私鑰
。“客戶”通過某些途徑拿到了“伺服器”釋出的
公鑰
,客戶並不知道
私鑰
。“客戶”具體是通過什麼途徑獲取
公鑰
的,我們後面再來說明,下面看一下雙方如何進行保密的通訊:
2.1 第一回合:
“客戶”->“伺服器”:你好
“伺服器”->“客戶”:你好,我是伺服器
“客戶”->“伺服器”:????
因為訊息是在網路上傳輸的,有人可以冒充自己是“伺服器”來向客戶傳送資訊。例如上面的訊息可以被黑客截獲如下:
“客戶”->“伺服器”:你好
“伺服器”->“客戶”:你好,我是伺服器
“客戶”->“黑客”:你好
// 黑客在“客戶”和“伺服器”之間的某個路由器上截獲“客戶”發給伺服器的資訊,然後自己冒充“伺服器”
“黑客”->“客戶”:你好,我是伺服器
因此“客戶”在接到訊息後,並不能肯定這個訊息就是由“伺服器”發出的,某些“黑客”也可以冒充“伺服器”發出這個訊息。如何確定資訊是由“伺服器”發過來的呢?有一個解決方法,因為只有伺服器有
私鑰
,所以如果只要能夠確認對方有
私鑰
,那麼對方就是“伺服器”。因此通訊過程可以改進為如下:
2.2 第二回合:
“客戶”->“伺服器”:你好
“伺服器”->“客戶”:你好,我是伺服器
“客戶”->“伺服器”:向我證明你就是伺服器
“伺服器”->“客戶”:你好,我是伺服器 {你好,我是伺服器}[私鑰|RSA]
// 注意這裡約定一下,{} 表示RSA加密後的內容,[ | ]表示用什麼金鑰和演算法進行加密,後面的示例中都用這種表示方式,例如上面的
{你好,我是伺服器}[
私鑰
|RSA]
就表示用
私鑰
對
“你好,我是伺服器”
進行加密後的結果。
為了向“客戶”證明自己是“伺服器”, “伺服器”把一個字串用自己的
私鑰
加密,把
明文
和加密後的
密文
一起發給“客戶”。對於這裡的例子來說,就是把字串
“你好,我是伺服器”
和這個字串用私鑰加密後的內容
{你好,我是伺服器}[私鑰
|RSA
]
發給客戶。
“客戶”收到資訊後,她用自己持有的
公鑰
解密密文,和明文進行對比,如果一致,說明資訊的確是由伺服器發過來的。也就是說“客戶”把
{你好,我是伺服器}[私鑰
|RSA]
這個內容用
公鑰
進行解密,然後和
“你好,我是伺服器”
對比。因為由“伺服器”用
私鑰
加密後的內容,
由並且只能由
公鑰
進行解密,
私鑰
只有“伺服器”持有,所以如果解密出來的內容是能夠對得上的,那說明資訊一定是從“伺服器”發過來的。
假設“黑客”想冒充“伺服器”:
“黑客”->“客戶”:你好,我是伺服器
“客戶”->“黑客”:向我證明你就是伺服器
“黑客”->“客戶”:你好,我是伺服器 {你好,我是伺服器}[???|RSA]
//這裡黑客無法冒充,因為他不知道
私鑰
,無法用
私鑰
加密某個字串後傳送給客戶去驗證。
“客戶”->“黑客
”:????
由於“黑客”沒有“伺服器”的
私鑰
,因此它傳送過去的內容,“客戶”是無法通過伺服器的
公鑰
解密的,因此可以認定對方是個冒牌貨!
到這裡為止,“客戶”就可以確認“伺服器”的身份了,可以放心和“伺服器”進行通訊,但是這裡有一個問題,通訊的內容在網路上還是無法保密。為什麼無法保密呢?通訊過程不是可以用
公鑰
、
私鑰
加密嗎?其實用RSA的
私鑰
和
公鑰
是不行的,我們來具體分析下過程,看下面的演示:
2.3 第三回合:
“客戶”->“伺服器”:你好
“伺服器”->“客戶”:你好,我是伺服器
“客戶”->“伺服器”:向我證明你就是伺服器
“伺服器”->“客戶”:你好,我是伺服器 {你好,我是伺服器}[私鑰|RSA]
“客戶”->“伺服器”:{我的帳號是aaa,密碼是123,把我的餘額的資訊發給我看看}[公鑰|RSA]
“伺服器”->“客戶”:{你的餘額是100元}[私鑰|RSA]
注意上面的的資訊
{你的餘額是100元}[私鑰],
這個是“伺服器”用
私鑰
加密後的內容,但是我們之前說了,
公鑰
是釋出出去的,因此所有的人都知道
公鑰
,所以除了“客戶”,其它的人也可以用
公鑰
對
{你的餘額是100元}[私鑰]
進行解密。所以如果“伺服器”用
私鑰
加密發給“客戶”,這個資訊是無法保密的,因為只要有
公鑰
就可以解密這內容。然而“伺服器”也不能用
公鑰
對傳送的內容進行加密,因為“客戶”沒有
私鑰
,傳送個“客戶”也解密不了。
這樣問題就又來了,那又如何解決呢?在實際的應用過程,一般是通過引入對稱加密來解決這個問題,看下面的演示:
2.4 第四回合:
“客戶”->“伺服器”:你好
“伺服器”->“客戶”:你好,我是伺服器
“客戶”->“伺服器”:向我證明你就是伺服器
“伺服器”->“客戶”:你好,我是伺服器 {你好,我是伺服器}[私鑰|RSA]
“客戶”->“伺服器”:{我們後面的通訊過程,用對稱加密來進行,這裡是
對稱加密演算法
和
金鑰
}[公鑰|RSA]
//藍色字型的部分是對稱加密的演算法和金鑰的具體內容,客戶把它們傳送給伺服器。
“伺服器”->“客戶”:{OK,收到!}[金鑰|對稱加密演算法]
“客戶”->“伺服器”:{我的帳號是aaa,密碼是123,把我的餘額的資訊發給我看看}[金鑰|對稱加密演算法]
“伺服器”->“客戶”:{你的餘額是100元}[金鑰|對稱加密演算法]
在上面的通訊過程中,“客戶”在確認了“伺服器”的身份後,“客戶”自己選擇一個
對稱加密演算法
和一個
金鑰
,把這個
對稱加密演算法
和
金鑰
一起用
公鑰
加密後傳送給“伺服器”。注意,由於
對稱加密演算法
和
金鑰
是用
公鑰
加密的,就算這個加密後的內容被“黑客”截獲了,由於沒有
私鑰
,“黑客”也無從知道
對稱加密演算法
和
金鑰
的內容。
由於是用
公鑰
加密的,只有
私鑰
能夠解密,這樣就可以保證只有伺服器可以知道
對稱加密演算法
和
金鑰
,而其它人不可能知道(這個
對稱加密演算法
和
金鑰
是“客戶”自己選擇的,所以“客戶”自己當然知道如何解密加密)。這樣“伺服器”和“客戶”就可以用
對稱加密演算法
和
金鑰
來加密通訊的內容了。
總結一下,RSA加密演算法在這個通訊過程中所起到的作用主要有兩個:
- 加密:通過加密演算法和公鑰對內容(或者說明文)進行加密,得到密文。加密過程需要用到公鑰。
- 解密:通過解密演算法
- 因為私鑰只有“伺服器”擁有,因此“客戶”可以通過判斷對方是否有私鑰來判斷對方是否是“伺服器”。
- 客戶端通過RSA的掩護,安全的和伺服器商量好一個對稱加密演算法和金鑰來保證後面通訊過程內容的安全。
- 證書的釋出機構
- 證書的有效期
- 公鑰
- 證書所有者(Subject)
- 簽名所使用的演算法
- 指紋以及指紋演算法