聊聊加密那點事——PHP加密最佳實踐

1. 加密的目的

加密不一樣於密碼,加密是一個動做或者過程,其目的就是將一段明文信息(人類或機器能夠直接讀懂的信息)變爲一段看上去沒有任何意義的字符,必須經過事先約定的解密規則才能將信息轉換回有意義的可讀信息,經過加密能夠防止非受權的信息竊取。php

2. 存儲加密和傳輸加密

按照加密對象的不一樣,能夠將加密分爲:存儲加密和傳輸加密。存儲加密是指對存儲在紙質、磁盤、數據庫等介質上的數據進行的加密,而傳輸加密則是指對數據在計算機網絡、電話、電報等通訊信道上進行的加密。不論是上述哪一種加密,本質上還是對信息進行加密。laravel

3. 加密算法

加密算法,通過歷史的演進,出現了不少種類的算法。我所瞭解的最簡單的加密算法,就是從電影裏看到的,經過一本字典或者聖經,使用頁碼和行列號等來對文字進行一一對應的加密。解密時,只要解密的人拿着相同的字典和聖經,知道數字與文字的對應關係,便可解密。這種加密方法曾經頗有效,由於用做加密的字典能夠是任何一本書或者甚至能夠是一份報紙。git

3.1 對稱加密算法

按照現代的加密算法劃分,上述的加密方法,能夠歸類爲對稱加密的範疇。
所謂對稱加密,就是加密和解密使用同一祕鑰,這也是這種加密算法最顯著的缺點之一。上面的字典、聖經等也能夠理解爲是一份祕鑰。現代的加密算法中,DES、3DES、AES等算法都屬於對稱加密算法。
對稱加密有一個明顯的缺點,就是即祕鑰。特別是在傳輸加密時,信息的發送方和接收方須要使用相同的祕鑰來對信息進行加解密,接收方如何安全的獲取祕鑰成爲這類加密的焦點,由於一旦祕鑰被截獲,整個加密通訊就形同明文傳輸。
所以,對稱加密比較適合存儲加密,例若有些計算機硬盤會經過主板上的加密芯片對整個硬盤進行加密,使用的就是對稱加密算法。github

3.2 非對稱加密算法

因爲對稱加密在通訊加密領域的缺陷,1976年W.Diffie和M.Hellman提出了「非對稱加密」的概念。這種加密算法的祕鑰分爲「公開祕鑰」和「私有祕鑰」,公開祕鑰用於對信息進行加密,而解密時使用私有祕鑰進行解密,這樣,信息的接收方能夠事先生成好一份公鑰和私鑰,而後將公鑰發給全部的信息發送方,信息發送方使用公鑰對信息進行加密,而後將信息發送給接收方,接收方使用私鑰進行解密便可。這種算法的優點在於,解密的私鑰不須要傳遞,下降(只能下降,沒法避免,要考慮認爲因素)了私鑰泄密的可能性。web

常見的非對稱加密算法有:RSA、EIGamal、揹包算法、Rebin(RSA的特例)、迪菲-赫爾曼密鑰交換協議中的公鑰加密算法和橢圓曲線加密算法等。而最爲你們熟知的就是RSA算法。算法

3.3 比較

對稱加密,因爲加解密雙發必須擁有相同的祕鑰,分發和同步祕鑰的通訊容易泄漏祕鑰,可是對稱加密的速度相比非對稱加密要快不少,特別對於大量數據的加密更加明顯。
非對稱加密,其主要缺點之一就是慢,適合加密少許數據。
所以,實際應用當中,常常將兩者結合使用,例如通訊雙方創建通訊後,A首先生成一對公鑰和私鑰,並將公鑰發送給B,B使用公鑰將一個對稱加密算法的「祕鑰+有效期」加密後,再發回給A,A使用私鑰解密後,雙方便同步了一個對稱算法的祕鑰,而後在規定的有效期內,雙方即可以使用這個祕鑰對通訊數據進行加密和解密。其過程大體以下圖所示:
加密通訊數據庫

3.4 誤區

看到這裏,有些同窗可能會問,我經常使用的md五、hash算法(sha一、sha25六、sha5十二、sha1024等)怎麼沒見你說起,其實準確的說,md5和hash算法不能算是加密算法,它們都屬於信息摘要算法,能夠爲不一樣的信息生成獨一無二的信息摘要,而它們都屬於不可逆算法,即沒法經過生成的摘要信息還原出原始信息。利用這種特性,實際應用中,常常會使用這些算法對用戶輸入的密碼進行運算,並對運算結果進行比較來驗證用戶輸入密碼是否正確。還有一種應用場景是通訊簽名,用於驗證通訊過程當中信息是否丟失或被篡改。編程

4. PHP加密最佳實踐

加密老是與安全密不可分,而每一個PHPer都必須將應用安全做爲必要的設計思路融入代碼中,如下是一些最佳實踐的建議。安全

  1. 不要再使用MD5,不要使用sha1,基本上已經沒有破解難度了。微信

  2. 請使用password_hash來哈希密碼(php版本大於等於5.5,小於5.5請使用password_compat庫),因爲password_hash函數已幫你處理好了加鹽,並且做爲鹽的隨機字串已經過加密算法成爲了哈希的一部分,password_verify()函數會自動將鹽從哈希中提取出來,因此你無需考慮鹽的存儲問題。

  3. 通訊接口的簽名,請使用非對稱算法對簽名祕鑰進行加密,並對祕鑰設置有效期,按期更換。

進一步閱讀:
對稱加密算法
非對稱加密算法
更新後的 PHP: 現代 PHP 中的密碼安全性
PHP編程之道:安全

若是你有任何問題或建議,能夠掃描下方二維碼或者微信搜索[phpjiagoushier],關注個人微信公衆號[PHP架構],與我交流互動。
phpjiagoushier

相關文章
相關標籤/搜索