總結數字簽名實現身份驗證

消息篡改和不可抵賴性

TCP協議確保數據能夠正確發送到通信雙方,加上數據加密算法保證數據安全傳輸,但是在HTTP應用中通信雙方通常不清楚發送方的身份,尤其在客戶端服務器通信下,通常一個服務器會處理多個客戶端連接,結合前一篇日誌講到的密鑰協商,對於服務器來說,它不需要知道客戶端是誰,在建立連接,協商好密鑰後,只要接收到的HTTP請求格式正確,數據解密無誤後便會發送相應信息,對於客戶端來說也是一樣。表面上來看,客戶端和服務器端只要數據能對應加密解密,正確,安全地發送到對方處,似乎就沒什麼問題。沒錯,數據加密保證了數據的機密性,消息驗證碼MAC算法保證了數據的完整性,接收方能夠確保接收到的數據是發送方的原始數據,沒有被篡改過,但是沒有解決的問題是身份驗證問題,無法確保和你通信的,發送數據的對方,是你正確的通信對象,這會出現的一個問題就是,第三方可以冒充你的通信方,給你發送消息。

在對稱加密中,如果密鑰泄露了,那麼別人就可以使用你們的密鑰進行加密解密,或者冒充通信方給你發消息,當你收到一條消息後,使用密鑰解密,解出可讀可理解的明文時,你可能就會誤認爲這條消息就是你的目標通信方發來的。在公開密鑰算法下,公鑰參數甚至可以是公開的,不需要對其做任何保護,在使用如DH密鑰協商算法時,目的是協商出解密私鑰,即使公鑰,p,g等參數泄露了也沒關係。公鑰只是加密時採用到,這就導致了由於公鑰公開,任何人都可以使用它來進行加密,並給你發送消息。

總的來說,如果不去驗證消息發送方的身份,會出現兩個問題:消息篡改和消息抵賴。消息篡改,假設A和B共享密鑰進行通信,過程中由於密鑰泄露,被C截獲了,C就可以使用密鑰進行加密解密,給A和B發送消息,無論是A和B,只要收到消息,就進行解密,如果解密出可讀可理解的明文,就容易誤認爲該消息就是對方發來的,殊不知這條消息其實是經過C篡改過,甚至是C無中生有捏造的。

消息抵賴問題,即無論假設A,B和C三方進行共同通信,共享相同的密鑰,A給C發送了一條消息後,A可以抵賴說這條消息不是他發送的,因爲B也有共同的密鑰,B也可以給C發送消息。對於C來說,他確實無法確認該加密數據是來自A還是來自B,因爲他們都共同擁有密鑰。相似的情況還有,假如A給C發送了一條消息,但是C無法向B證明這條消息是來自於A的,對於B來說,由於C也擁有密鑰,該消息可能是C自己使用密鑰加密來的,C無法像B證明消息的來源。

出現上述的消息篡改和消息抵賴性問題,原因都在於通信的一方無法確定消息發送方的身份,所以除了進行消息加密,消息驗證外,還需要解決的問題,是身份驗證。

 

數字簽名-驗證過程

數字簽名算法和消息驗證碼類似,消息驗證碼完成消息驗證,數字簽名完成身份驗證。在消息驗證碼MAC算法中,通信雙方使用共同的密鑰對消息進行MAC運算生成唯一的摘要值,然後與消息一起發送,接收方接收到數據後,先使用相同的密鑰對消息進行MAC運算得到摘要值,然後與一同發送來的摘要值比較,相同則表示MAC驗證正確。數字簽名類似,拿公開密鑰RSA算法來舉例,客戶端擁有自己的私鑰和服務器端的公鑰,服務器端擁有自己的私鑰和客戶端的公鑰,那麼對於雙方來說,什麼東西可以唯一標識自己?就是他們各自持有的私鑰,客戶端可以用自己的私鑰“簽名”一條消息,然後發送給服務器端,服務器端擁有客戶端的公鑰,可以反解出該消息,由於這條消息是使用服務器端的私鑰“簽名“的,服務器端的私鑰從來沒有公開過,發送過出去,所以服務器端無法抵賴說這條消息不是來自他的。

生成簽名

拿公開密鑰RSA算法舉例,生成簽名的過程總結如下:

  1. 對消息進行Hash運算(如SHA-256)得到摘要值。
  2. 發送方使用自己的私鑰對摘要值進行“簽名“運算,得到簽名值。
  3. 將原始信息和簽名值一起發送給接收者。

驗證簽名

接收方收到信息後,首先驗證簽名:

  1. 對數據拆分出原始消息和簽名值。
  2. 接收方使用自己的公鑰對簽名值進行簽名算法運算,得到摘要值。
  3. 再對原始消息進行Hash運算得到另一個摘要值。
  4. 最後比較兩個摘要值是否相等,相等則表明信息來自對方,無法抵賴。

 

RSA數字簽名

RSA公開密鑰在密鑰協商完成後,使用公鑰進行加密,私鑰進行解密。而上面的流程圖可以看到,在數字簽名裏,私鑰用來簽名消息,公鑰用來驗證簽名。雖然這樣做任何擁有公鑰的人都可以驗證這個消息,但是沒關係,數字簽名是用來做身份驗證的,防抵賴,目的是驗證發送方的身份,防止其發送了消息後又抵賴這消息不是他發出的,所以,任何人可以驗證消息簽名也不會造成什麼影響。

示例首先使用RSA算法生成密鑰長度爲1024比特的密鑰對,然後分理處公鑰做驗證簽名用。對message.txt文件使用Hash算法sha256生成摘要值並用簽名算法生成簽名文件signature.txt。最後使用分離出的公鑰rsapublickey.pem驗證簽名。

 

DSA數字簽名

DSA則是數字簽名算法裏的一個標準算法,就像對稱加密有標準算法AES一樣。DSA算法在數字簽名實現過程和RSA一樣,都是生成密鑰對後,使用私鑰進行簽名,公鑰進行驗證,可以從DSA生成的參數文件裏看出:

參數文件

首先生成參數文件,然後通過參數文件生成密鑰對dsaprivatekey.pem,接着分離出公鑰用來做驗證。

 

示例命令已上傳:

https://github.com/justinzengtm/Network-Engineering

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章