1. 加密的目的
加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機器可以直接讀懂的信息)變為一段看上去沒有任何意義的字符,必須通過事先約定的解密規則才能將信息轉換回有意義的可讀信息,通過加密可以防止非授權的信息竊取。
2. 存儲加密和傳輸加密
按照加密對象的不同,可以將加密分為:存儲加密和傳輸加密。存儲加密是指對存儲在紙質、磁盤、數據庫等介質上的數據進行的加密,而傳輸加密則是指對數據在計算機網絡、電話、電報等通信信道上進行的加密。不管是上述哪種加密,本質上仍是對信息進行加密。
3. 加密算法
加密算法,經過歷史的演進,出現了很多種類的算法。我所了解的最簡單的加密算法,就是從電影里看到的,通過一本字典或者圣經,使用頁碼和行列號等來對文字進行一一對應的加密。解密時,只要解密的人拿著相同的字典和圣經,知道數字與文字的對應關系,即可解密。這種加密方法曾經很有效,因為用作加密的字典可以是任何一本書或者甚至可以是一份報紙。
3.1 對稱加密算法
按照現代的加密算法劃分,上述的加密方法,可以歸類為對稱加密的范疇。
所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點之一。上面的字典、圣經等也可以理解為是一份秘鑰,F代的加密算法中,DES、3DES、AES等算法都屬于對稱加密算法。
對稱加密有一個明顯的缺點,就是即秘鑰。特別是在傳輸加密時,信息的發送方和接收方需要使用相同的秘鑰來對信息進行加解密,接收方如何安全的獲取秘鑰成為這類加密的焦點,因為一旦秘鑰被截獲,整個加密通信就形同明文傳輸。
因此,對稱加密比較適合存儲加密,例如有些計算機硬盤會通過主板上的加密芯片對整個硬盤進行加密,使用的就是對稱加密算法。
3.2 非對稱加密算法
由于對稱加密在通信加密領域的缺陷,1976年W.Diffie和M.Hellman提出了“非對稱加密”的概念。這種加密算法的秘鑰分為“公開秘鑰”和“私有秘鑰”,公開秘鑰用于對信息進行加密,而解密時使用私有秘鑰進行解密,這樣,信息的接收方可以事先生成好一份公鑰和私鑰,然后將公鑰發給所有的信息發送方,信息發送方使用公鑰對信息進行加密,然后將信息發送給接收方,接收方使用私鑰進行解密即可。這種算法的優勢在于,解密的私鑰不需要傳遞,降低(只能降低,無法避免,要考慮認為因素)了私鑰泄密的可能性。
常見的非對稱加密算法有:RSA、EIGamal、背包算法、Rebin(RSA的特例)、迪菲-赫爾曼密鑰交換協議中的公鑰加密算法和橢圓曲線加密算法等。而最為大家熟知的就是RSA算法。
3.3 比較
對稱加密,由于加解密雙發必須擁有相同的秘鑰,分發和同步秘鑰的通信容易泄漏秘鑰,但是對稱加密的速度相比非對稱加密要快很多,特別對于大量數據的加密更加明顯。
非對稱加密,其主要缺點之一就是慢,適合加密少量數據。
因此,實際應用當中,經常將二者結合使用,例如通信雙方建立通信后,A首先生成一對公鑰和私鑰,并將公鑰發送給B,B使用公鑰將一個對稱加密算法的“秘鑰+有效期”加密后,再發回給A,A使用私鑰解密后,雙方便同步了一個對稱算法的秘鑰,然后在規定的有效期內,雙方便可以使用這個秘鑰對通信數據進行加密和解密。其過程大致如下圖所示:

3.4 誤區
看到這里,有些同學可能會問,我常用的md5、hash算法(sha1、sha256、sha512、sha1024等)怎么沒見你提及,其實準確的說,md5和hash算法不能算是加密算法,它們都屬于信息摘要算法,可以為不同的信息生成獨一無二的信息摘要,而它們都屬于不可逆算法,即無法通過生成的摘要信息還原出原始信息。利用這種特性,實際應用中,經常會使用這些算法對用戶輸入的密碼進行運算,并對運算結果進行比較來驗證用戶輸入密碼是否正確。還有一種應用場景是通信簽名,用于驗證通信過程中信息是否丟失或被篡改。
4. PHP加密最佳實踐
加密總是與安全密不可分,而每個PHPer都必須將應用安全作為必要的設計思路融入代碼中,以下是一些最佳實踐的建議。
不要再使用MD5,不要使用sha1,基本上已經沒有破解難度了。
請使用password_hash來哈希密碼(php版本大于等于5.5,小于5.5請使用password_compat庫),由于password_hash函數已幫你處理好了加鹽,而且作為鹽的隨機字串已通過加密算法成為了哈希的一部分,password_verify()函數會自動將鹽從哈希中提取出來,所以你無需考慮鹽的存儲問題。
通信接口的簽名,請使用非對稱算法對簽名秘鑰進行加密,并對秘鑰設置有效期,定期更換。
|