開發中的幾種加密演算法的使用場景

FKNIGHT0X發表於2018-07-24

資料傳輸過程中的加密是程式開發中避不開的一個問題。如何更科學更合理的使用加密演算法也就成了一個開發人員必須瞭解的知識點,本文就該問題做簡單的介紹。

注意:這些演算法的詳細知識不屬於本文的範圍。本文主要是根據其特點,說明如何在開發中合理使用這些演算法。

常見的加密演算法:

加密演算法有很多,這裡只列出開發中常用的幾種。

  MD5:

嚴格來講這不算是一種加密演算法,應該叫做資訊摘要演算法。也是目前開發中應用非常廣的演算法。MD5是一種不可逆的加密演算法,無法通過密文還原成明文(注意:是演算法上不能實現),對於簡單的MD5加密,是可以通過一些線上工具網站解密出來。目前在開發中主要用在檔案(圖片、視訊、文件等檔案)的唯一性標識。比如我們的系統有一個需求,需要儲存每一個使用者上傳的 word 文件,word文件的命名沒有強制要求規則,這時就會發生這樣一種情況,使用者A 和 使用者B 都上傳了的一個名為 《大資料學習路徑規劃》的word檔案。這時系統如果直接儲存在同一個目錄下就會造成衝突,就像 windows 裡面同一個資料夾下不能有同名檔案一樣。這個時候要解決衝突就可以採用MD5,當然解決方式不止這一種。具體操作就是我們可以使用 md5 對檔案進行一個計算得到其 hash 值,只要是兩個不同的檔案,該值就是唯一的,所以就可以這個hash值作為該檔案的實際儲存名,原名根據需求儲存即可。

   RSA和AES

 RSA是一種非對稱的加密演算法(加密【公鑰】和解密【私鑰】的 key 是不同的),AES是對稱的加密演算法(加密和解密的 key 是相同的),兩者的詳細知識不屬於本文範圍。

分析這兩種演算法的特點可以知道,單純的使用 AES 的來加密兩者傳輸中的資料的時候首先要讓雙方要知道祕鑰是什麼,可問題就是這個祕鑰的傳輸是一個問題,直接通過網路傳輸是極其不安全的。因為網路一旦被監聽,這個祕鑰就沒有存在的意義了,而監聽一個網路,難度並不是很大,所以我們不能直接使用AES。

再來看RSA,由於RSA是非對稱的加密演算法,私鑰用來解密,公鑰用來加密,公鑰之所以帶“”,也是因為其本身就是就需要對外公開的,並不需要保密。這樣對於通訊雙方來說,建立連結之後的第一件事就是雙方分發自己的公鑰給對方,一端資料傳輸給對方的時候,先使用接收方發過來的公鑰對資料進行加密後再傳送,之後接收方會使用自己的私鑰解密資料得到明文,然後再使用對方的公鑰加密敏感的響應資料,之後再傳送給對方,對方拿自己的私鑰解密。這樣就完成了資料的加密傳輸通訊。我們分析這個過程可以知道,整個傳輸過程中,只是對外暴露了公鑰,這時即使黑客拿到了公鑰,但是也無法解密傳輸過程中的資料,因為只有私鑰才能解密資料。這樣看起來就完美的解決了雙方的加密通訊問題。但是有這種加密演算法相比 AES 比較耗資源,對於一個訪問量比較大的web服務來說,是不推薦的。

RSA和AES的結合:

通過上面的分析,我們結合兩者的優點,建立新的使用模式。先來張圖做一個簡單介紹

      從上圖可以看出,當客戶端要與伺服器端通訊的時候,客戶端先使用 RSA 演算法生成自己的公鑰和私鑰,然後把公鑰以明文的方式傳送給伺服器,伺服器拿到公鑰,並使用從客戶端接收到的公鑰對 AES 的祕鑰進行加密然後返回給客戶端。客戶端接收到加密後的 AES 祕鑰後就可以直接使用自己的私鑰解密 AES 的祕鑰,從而得到 AES 祕鑰明文。之後兩者的通訊就可以使用 AES來實現敏感資訊的加密了。這個操作就即解決了 AES 祕鑰的傳輸問題,又解決了 RSA 演算法效率不高的問題。

相關文章