各種算法的特點:
哈希算法:快進,不可逆,即加密後很難解密明文。通常用於數據加密和數據驗證。
對稱加密算法:AES是壹種常用的對稱加密算法,其特點是加密和解密使用相同的密鑰。
非對稱加密算法RSA:RSA算法是壹種非對稱加密算法。由私鑰和公鑰組成的密鑰對由私鑰加密,由公鑰解密,或者由公鑰加密,由私鑰解密。其中,公鑰可以公開,私鑰必須保密。
Diffie-Hellman密鑰協商算法:Diffie-Hellman是壹種密鑰協商算法(簡稱DH算法),DH算法基於壹種數學原理,可以在不泄露密鑰的情況下協商出壹個密鑰。
在從客戶端向服務器發送數據的過程中,如果是重要數據(如密碼、敏感數據等。),發送前壹般需要在客戶端加密,服務器接收後解密得到原始數據。(服務器向客戶端返回數據也是如此。)
假設客戶端和服務器使用AES(對稱加密算法)來加密和解密傳輸的數據。AES加密算法的壹個特點是加密和解密都使用同壹個密鑰(這裏稱為secretKey),所以雙方都使用secretKey對數據進行加密和解密。
所以客戶端第壹次向服務器傳輸數據時,需要從服務器獲取secretKey並保存在客戶端,而這個直接從服務器獲取明文secretKey的過程很容易被第三方截獲,也就是說這個過程是不安全的。(哈哈,除非服務器把secretKey寫在紙上偷偷交給客戶端)
因此,客戶端從服務器獲取secretKey的過程也需要加密。
那麽,服務器需要做什麽來安全地將secretKey交付給客戶機呢?
目前常用的方法有RSA或Diffie-Hellman。
RSA有公鑰和私鑰,公鑰允許公開,私鑰保留。RSA的關鍵點是,用公鑰加密的數據需要用私鑰解密,用私鑰加密的數據需要用公鑰解密。所以,比如這個時候,客戶端把公鑰發送給服務器,服務器用客戶端的公鑰加密secretKey,那麽只有客戶端的私鑰才能解鎖這個加密的secretKey數據。即使第三方拿到了這些數據,除非能拿到客戶端的私鑰,否則也無法解密。
因此,通過RSA,服務器可以安全地將secretKey交付給客戶端。(不過RSA也有安全漏洞,叫做中間人攻擊。因為篇幅原因,這裏就不說了!大家自己百度。)
RSA雖然可以安全傳輸secretKey,但麻煩的是需要生成壹對公鑰和私鑰並將公鑰發送給對方,加解密速度慢。因此引入了第二種類型:Diffie-Hellman密鑰協商算法。
嚴格來說,DH算法其實並不是加密算法,因為它本身並不是用來加密的。我的理解是用於雙方協商計算,即雙方按照某個合同進行計算,從而計算出相同的結果。
原理如下:
第壹步:初始化
比如服務器現在提供兩個隨機公鑰數(public允許):pubN=10,modN = 3;
客戶端生成壹個隨機私鑰數(不公開,服務器不知道):cPrivN = 2;
服務器還生成壹個隨機的私鑰數(不公開,客戶端不知道):sPrivN = 4;
第二步:客戶端和服務器端分別基於同壹個數學公式進行計算,計算結果稱為公鑰結果:pubResult。
客戶端進行數學計算:CPU b result = PUBN * CPRIVN % MODN = 10 * 2% 3 = 2;(計算結果允許公開)
服務器進行數學計算:spubresult = pubn * Sprivn % MODN = 10 * 4% 3 = 1;(計算結果允許公開)
客戶端和服務器交換公鑰結果,客戶端得到sPubResult=1,服務器得到cPubResult=2。
第三步:協商壹致的密鑰號:keyN(客戶端和服務器獲得的結果是相同的)
客戶端:ckeyn = spubresult * cprivn % MODN = 1 * 2% 3 = 2;
server:skeyn = CPU b result * spritvn % modn = 2 * 4% 3 = 2;
到目前為止,雙方都協商好了密鑰,而且是壹致的。但是,妳見過key是#類型的嗎?可能沒有,所以需要第四步來生成壹個更長的密鑰。
步驟4:散列密鑰號以生成密鑰串。